summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.hgignore1
-rw-r--r--indra/cmake/00-Common.cmake5
-rw-r--r--indra/cmake/Copy3rdPartyLibs.cmake6
-rw-r--r--indra/cmake/LLPrimitive.cmake22
-rw-r--r--indra/cmake/Variables.cmake2
-rw-r--r--indra/llcharacter/llcharacter.cpp4
-rw-r--r--indra/llcharacter/lleditingmotion.cpp2
-rw-r--r--indra/llcommon/CMakeLists.txt2
-rw-r--r--indra/llcommon/llapp.cpp2
-rw-r--r--indra/llcommon/llassettype.cpp2
-rw-r--r--indra/llcommon/llassettype.h7
-rw-r--r--indra/llcommon/lleventtimer.cpp95
-rw-r--r--indra/llcommon/lleventtimer.h60
-rw-r--r--indra/llcommon/llfasttimer_class.cpp111
-rw-r--r--indra/llcommon/llfoldertype.cpp3
-rw-r--r--indra/llcommon/llfoldertype.h6
-rw-r--r--indra/llcommon/llinstancetracker.cpp20
-rw-r--r--indra/llcommon/llinstancetracker.h69
-rw-r--r--indra/llcommon/lllivefile.cpp2
-rw-r--r--indra/llcommon/llthread.cpp46
-rw-r--r--indra/llcommon/llthread.h548
-rw-r--r--indra/llcommon/lltimer.cpp57
-rw-r--r--indra/llcommon/lltimer.h22
-rw-r--r--indra/llcommon/stdenums.h3
-rw-r--r--indra/llcommon/tests/llinstancetracker_test.cpp28
-rw-r--r--indra/llimage/llimage.cpp3
-rw-r--r--indra/llinventory/llinventorytype.cpp29
-rw-r--r--indra/llinventory/llinventorytype.h4
-rw-r--r--indra/llmath/llvolume.cpp761
-rw-r--r--indra/llmath/llvolume.h37
-rw-r--r--indra/llmath/llvolumemgr.cpp15
-rw-r--r--indra/llmath/llvolumemgr.h1
-rw-r--r--indra/llmath/m4math.cpp57
-rw-r--r--indra/llmath/m4math.h2
-rw-r--r--indra/llmath/v2math.cpp15
-rw-r--r--indra/llmath/v2math.h3
-rw-r--r--indra/llmessage/llassetstorage.cpp2
-rw-r--r--indra/llmessage/llpumpio.cpp7
-rw-r--r--indra/llmessage/lltransfermanager.cpp2
-rw-r--r--indra/llmessage/lltransfersourceasset.cpp2
-rw-r--r--indra/llmessage/tests/llareslistener_test.cpp2
-rw-r--r--indra/llplugin/llpluginclassmedia.cpp12
-rw-r--r--indra/llplugin/llpluginclassmedia.h4
-rw-r--r--indra/llplugin/llpluginmessagepipe.cpp9
-rw-r--r--indra/llplugin/llpluginprocesschild.cpp23
-rw-r--r--indra/llprimitive/CMakeLists.txt4
-rw-r--r--indra/llprimitive/llprimitive.cpp17
-rw-r--r--indra/llprimitive/llprimitive.h3
-rw-r--r--indra/llrender/llfontfreetype.cpp9
-rw-r--r--indra/llrender/llrender.cpp23
-rw-r--r--indra/llrender/llrendertarget.cpp11
-rw-r--r--indra/llrender/llvertexbuffer.cpp4
-rw-r--r--indra/llui/CMakeLists.txt2
-rw-r--r--indra/llui/llbutton.cpp23
-rw-r--r--indra/llui/llbutton.h18
-rw-r--r--indra/llui/llconsole.cpp59
-rw-r--r--indra/llui/llconsole.h11
-rw-r--r--indra/llui/lldockablefloater.cpp4
-rw-r--r--indra/llui/lldockablefloater.h2
-rw-r--r--indra/llui/lllayoutstack.cpp5
-rw-r--r--indra/llui/lllineeditor.cpp313
-rw-r--r--indra/llui/lllineeditor.h38
-rw-r--r--indra/llui/llmenugl.cpp1
-rw-r--r--indra/llui/llmultifloater.cpp8
-rw-r--r--indra/llui/llmultisliderctrl.cpp6
-rw-r--r--indra/llui/llpanel.cpp2
-rw-r--r--indra/llui/llpanel.h2
-rw-r--r--indra/llui/llsearcheditor.cpp7
-rw-r--r--indra/llui/llsliderctrl.cpp2
-rw-r--r--indra/llui/llspinctrl.cpp2
-rw-r--r--indra/llui/lltabcontainer.cpp163
-rw-r--r--indra/llui/lltabcontainer.h29
-rw-r--r--indra/llui/lltextbase.cpp18
-rw-r--r--indra/llui/lltexteditor.cpp54
-rw-r--r--indra/llui/lltexteditor.h10
-rw-r--r--indra/llui/lltextvalidate.cpp302
-rw-r--r--indra/llui/lltextvalidate.h63
-rw-r--r--indra/llui/lltooltip.h3
-rw-r--r--indra/llui/lluicolortable.cpp29
-rw-r--r--indra/llui/lluicolortable.h9
-rw-r--r--indra/llui/llview.cpp2
-rw-r--r--indra/llvfs/llvfile.cpp2
-rw-r--r--indra/llvfs/llvfs.cpp3
-rw-r--r--indra/llwindow/CMakeLists.txt1
-rw-r--r--indra/llwindow/lldragdropwin32.cpp3
-rw-r--r--indra/llwindow/llwindow.h4
-rw-r--r--indra/llwindow/llwindowmacosx.cpp69
-rw-r--r--indra/llwindow/llwindowmacosx.h5
-rw-r--r--indra/llwindow/llwindowsdl.cpp75
-rw-r--r--indra/llwindow/llwindowsdl.h13
-rw-r--r--indra/llwindow/llwindowwin32.cpp25
-rw-r--r--indra/llwindow/llwindowwin32.h6
-rw-r--r--indra/lscript/lscript_compile/lscript_tree.cpp2
-rw-r--r--indra/lscript/lscript_compile/lscript_tree.h4
-rw-r--r--indra/media_plugins/webkit/CMakeLists.txt14
-rw-r--r--indra/media_plugins/webkit/media_plugin_webkit.cpp136
-rw-r--r--indra/newview/CMakeLists.txt18
-rw-r--r--indra/newview/app_settings/ignorable_dialogs.xml11
-rw-r--r--indra/newview/app_settings/settings.xml112
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl25
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl25
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl102
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl82
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl9
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl24
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl25
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl58
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl11
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl86
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl9
-rw-r--r--indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl27
-rw-r--r--indra/newview/licenses-win32.txt69
-rw-r--r--indra/newview/llagent.cpp7
-rw-r--r--indra/newview/llagent.h2
-rw-r--r--indra/newview/llagentui.cpp8
-rw-r--r--indra/newview/llagentwearables.cpp116
-rw-r--r--indra/newview/llagentwearables.h3
-rw-r--r--indra/newview/llappearancemgr.cpp93
-rw-r--r--indra/newview/llappearancemgr.h112
-rw-r--r--indra/newview/llappviewer.cpp110
-rw-r--r--indra/newview/llappviewer.h1
-rw-r--r--indra/newview/llassetuploadresponders.cpp778
-rw-r--r--indra/newview/llassetuploadresponders.h55
-rw-r--r--indra/newview/llavataractions.cpp7
-rw-r--r--indra/newview/llbottomtray.cpp10
-rw-r--r--indra/newview/llcallfloater.cpp38
-rw-r--r--indra/newview/llcallingcard.cpp27
-rw-r--r--indra/newview/llchathistory.cpp54
-rw-r--r--indra/newview/llchatitemscontainerctrl.cpp5
-rw-r--r--indra/newview/llchiclet.cpp28
-rw-r--r--indra/newview/llcurrencyuimanager.cpp2
-rw-r--r--indra/newview/lldrawable.cpp38
-rw-r--r--indra/newview/lldrawable.h6
-rw-r--r--indra/newview/lldrawpool.cpp4
-rw-r--r--indra/newview/lldrawpoolalpha.cpp9
-rw-r--r--indra/newview/lldrawpoolbump.cpp20
-rw-r--r--indra/newview/lldrawpoolbump.h2
-rw-r--r--indra/newview/lldrawpooltree.cpp4
-rw-r--r--indra/newview/lldriverparam.cpp6
-rw-r--r--indra/newview/lleventpoll.cpp2
-rw-r--r--indra/newview/llface.cpp145
-rw-r--r--indra/newview/llface.h7
-rw-r--r--indra/newview/llfavoritesbar.cpp36
-rw-r--r--indra/newview/llfeaturemanager.cpp1
-rw-r--r--indra/newview/llfilepicker.cpp28
-rw-r--r--indra/newview/llfilepicker.h4
-rw-r--r--indra/newview/llfloatercamera.cpp24
-rw-r--r--indra/newview/llfloatercolorpicker.cpp2
-rw-r--r--indra/newview/llfloaterevent.cpp324
-rw-r--r--indra/newview/llfloaterevent.h96
-rw-r--r--indra/newview/llfloaterfriends.cpp2
-rw-r--r--indra/newview/llfloatergesture.cpp28
-rw-r--r--indra/newview/llfloatergodtools.cpp14
-rw-r--r--indra/newview/llfloaterimagepreview.cpp5
-rw-r--r--indra/newview/llfloaterland.cpp4
-rw-r--r--indra/newview/llfloatermediasettings.cpp2
-rw-r--r--indra/newview/llfloaternamedesc.cpp4
-rw-r--r--indra/newview/llfloaternotificationsconsole.cpp22
-rw-r--r--indra/newview/llfloaterpay.cpp2
-rw-r--r--indra/newview/llfloaterpreference.cpp138
-rw-r--r--indra/newview/llfloaterpreference.h3
-rw-r--r--indra/newview/llfloaterproperties.cpp10
-rw-r--r--indra/newview/llfloaterscriptlimits.cpp24
-rw-r--r--indra/newview/llfloaterscriptlimits.h44
-rw-r--r--indra/newview/llfloatersellland.cpp4
-rw-r--r--indra/newview/llfloatertools.cpp6
-rw-r--r--indra/newview/llfloateruipreview.cpp5
-rw-r--r--indra/newview/llfloaterwater.cpp2
-rw-r--r--indra/newview/llfloaterwindlight.cpp2
-rw-r--r--indra/newview/llfolderview.cpp28
-rw-r--r--indra/newview/llfolderview.h5
-rw-r--r--indra/newview/llfolderviewitem.cpp15
-rw-r--r--indra/newview/llgroupmgr.cpp9
-rw-r--r--indra/newview/llgroupmgr.h10
-rw-r--r--indra/newview/llhudtext.cpp12
-rw-r--r--indra/newview/llhudtext.h1
-rw-r--r--indra/newview/llimfloater.cpp13
-rw-r--r--indra/newview/llimfloatercontainer.cpp77
-rw-r--r--indra/newview/llimfloatercontainer.h7
-rw-r--r--indra/newview/llimview.cpp47
-rw-r--r--indra/newview/llimview.h3
-rw-r--r--indra/newview/llinspect.cpp21
-rw-r--r--indra/newview/llinspect.h1
-rw-r--r--indra/newview/llinventorybridge.cpp206
-rw-r--r--indra/newview/llinventorybridge.h35
-rw-r--r--indra/newview/llinventoryfunctions.cpp120
-rw-r--r--indra/newview/llinventorypanel.cpp25
-rw-r--r--indra/newview/llinventorypanel.h18
-rw-r--r--indra/newview/lllocaltextureobject.cpp1
-rw-r--r--indra/newview/lllocationinputctrl.cpp121
-rw-r--r--indra/newview/lllocationinputctrl.h15
-rw-r--r--indra/newview/llmediactrl.cpp24
-rwxr-xr-xindra/newview/llmediadataclient.h2
-rw-r--r--indra/newview/llnamelistctrl.cpp6
-rw-r--r--indra/newview/llnearbychathandler.cpp6
-rw-r--r--indra/newview/llnotificationalerthandler.cpp6
-rw-r--r--indra/newview/lloutputmonitorctrl.cpp6
-rw-r--r--indra/newview/llpanelavatar.cpp32
-rw-r--r--indra/newview/llpanelavatar.h5
-rw-r--r--indra/newview/llpanelclassified.cpp4
-rw-r--r--indra/newview/llpanelgroup.cpp35
-rw-r--r--indra/newview/llpanelgroup.h3
-rw-r--r--indra/newview/llpanelgroupgeneral.cpp10
-rw-r--r--indra/newview/llpanelgroupinvite.cpp40
-rw-r--r--indra/newview/llpanelgroupinvite.h4
-rw-r--r--indra/newview/llpanelgroupnotices.cpp1
-rw-r--r--indra/newview/llpanelimcontrolpanel.cpp21
-rw-r--r--indra/newview/llpanelimcontrolpanel.h3
-rw-r--r--indra/newview/llpanellandaudio.cpp7
-rw-r--r--indra/newview/llpanellandmarkinfo.cpp15
-rw-r--r--indra/newview/llpanellandmarks.cpp56
-rw-r--r--indra/newview/llpanellandmarks.h2
-rw-r--r--indra/newview/llpanellogin.cpp10
-rw-r--r--indra/newview/llpanelme.cpp17
-rw-r--r--indra/newview/llpanelmediasettingsgeneral.cpp2
-rw-r--r--indra/newview/llpanelobjectinventory.cpp117
-rw-r--r--indra/newview/llpanelpeople.cpp1
-rw-r--r--indra/newview/llpanelpermissions.cpp4
-rw-r--r--indra/newview/llpanelpicks.cpp11
-rw-r--r--indra/newview/llpanelplaces.cpp7
-rw-r--r--indra/newview/llpanelprimmediacontrols.cpp5
-rw-r--r--indra/newview/llpanelvolume.cpp4
-rw-r--r--indra/newview/llplacesinventorypanel.cpp10
-rw-r--r--indra/newview/llplacesinventorypanel.h2
-rw-r--r--indra/newview/llpreviewanim.cpp2
-rw-r--r--indra/newview/llpreviewgesture.cpp6
-rw-r--r--indra/newview/llpreviewnotecard.cpp2
-rw-r--r--indra/newview/llpreviewscript.cpp6
-rw-r--r--indra/newview/llpreviewsound.cpp2
-rw-r--r--indra/newview/llpreviewtexture.cpp2
-rw-r--r--indra/newview/llscriptfloater.cpp378
-rw-r--r--indra/newview/llscriptfloater.h73
-rw-r--r--indra/newview/llsearchcombobox.cpp1
-rw-r--r--indra/newview/llselectmgr.cpp124
-rw-r--r--indra/newview/llselectmgr.h3
-rw-r--r--indra/newview/llsidepanelappearance.cpp4
-rw-r--r--indra/newview/llsidepanelinventory.cpp10
-rw-r--r--indra/newview/llsidepaneliteminfo.cpp13
-rw-r--r--indra/newview/llsidepaneltaskinfo.cpp4
-rw-r--r--indra/newview/llsidetray.h2
-rw-r--r--indra/newview/llslurl.cpp13
-rw-r--r--indra/newview/llslurl.h1
-rw-r--r--indra/newview/llspatialpartition.cpp4
-rw-r--r--indra/newview/llspatialpartition.h2
-rw-r--r--indra/newview/llspeakers.cpp19
-rw-r--r--indra/newview/llspeakers.h11
-rw-r--r--indra/newview/llstartup.cpp86
-rw-r--r--indra/newview/llstylemap.cpp4
-rw-r--r--indra/newview/llsyswellwindow.cpp118
-rw-r--r--indra/newview/llsyswellwindow.h23
-rw-r--r--indra/newview/lltexturecache.cpp3
-rw-r--r--indra/newview/lltexturectrl.cpp6
-rw-r--r--indra/newview/lltexturefetch.cpp129
-rw-r--r--indra/newview/lltexturefetch.h11
-rw-r--r--indra/newview/lltoastimpanel.cpp37
-rw-r--r--indra/newview/lltoastnotifypanel.cpp9
-rw-r--r--indra/newview/lltooldraganddrop.cpp67
-rw-r--r--indra/newview/lltooldraganddrop.h12
-rw-r--r--indra/newview/lltoolmorph.cpp12
-rw-r--r--indra/newview/lltoolpie.cpp6
-rw-r--r--indra/newview/llviewerassettype.cpp2
-rw-r--r--indra/newview/llviewercontrol.cpp1
-rw-r--r--indra/newview/llviewerdisplay.cpp12
-rw-r--r--indra/newview/llviewerfloaterreg.cpp10
-rw-r--r--indra/newview/llviewerinventory.cpp4
-rw-r--r--indra/newview/llviewerjointmesh.cpp2
-rw-r--r--indra/newview/llviewermedia.cpp72
-rw-r--r--indra/newview/llviewermedia.h5
-rw-r--r--indra/newview/llviewermediafocus.cpp12
-rw-r--r--indra/newview/llviewermediafocus.h2
-rw-r--r--indra/newview/llviewermenu.cpp48
-rw-r--r--indra/newview/llviewermenufile.cpp586
-rw-r--r--indra/newview/llviewermenufile.h83
-rw-r--r--indra/newview/llviewermessage.cpp41
-rw-r--r--indra/newview/llviewerobject.cpp9
-rw-r--r--indra/newview/llviewerobjectlist.cpp4
-rw-r--r--indra/newview/llviewerobjectlist.h4
-rw-r--r--indra/newview/llviewerparcelmedia.cpp9
-rw-r--r--indra/newview/llviewerparcelmediaautoplay.h2
-rw-r--r--indra/newview/llviewerparcelmgr.cpp6
-rw-r--r--indra/newview/llviewerregion.cpp3
-rw-r--r--indra/newview/llviewertexteditor.cpp1
-rw-r--r--indra/newview/llviewertexture.cpp233
-rw-r--r--indra/newview/llviewertexture.h15
-rw-r--r--indra/newview/llviewerwindow.cpp223
-rw-r--r--indra/newview/llvoavatar.cpp26
-rw-r--r--indra/newview/llvoavatar.h2
-rw-r--r--indra/newview/llvoavatarself.cpp15
-rw-r--r--indra/newview/llvoicechannel.cpp11
-rw-r--r--indra/newview/llvoicechannel.h4
-rw-r--r--indra/newview/llvotree.cpp6
-rw-r--r--indra/newview/llvovolume.cpp231
-rw-r--r--indra/newview/llvovolume.h18
-rw-r--r--indra/newview/llvowlsky.cpp2
-rw-r--r--indra/newview/llworld.cpp2
-rw-r--r--indra/newview/llworldmapview.cpp6
-rw-r--r--indra/newview/pipeline.cpp160
-rw-r--r--indra/newview/pipeline.h13
-rw-r--r--indra/newview/skins/default/colors.xml2
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_Shoe.pngbin276 -> 54133 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/object_icon.pngbin0 -> 410 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml27
-rw-r--r--indra/newview/skins/default/textures/windows/Volume_Background.pngbin0 -> 589 bytes
-rw-r--r--indra/newview/skins/default/textures/world/BeaconArrow.pngbin1965 -> 994 bytes
-rw-r--r--indra/newview/skins/default/xui/de/floater_about.xml3
-rw-r--r--indra/newview/skins/default/xui/de/floater_about_land.xml18
-rw-r--r--indra/newview/skins/default/xui/de/floater_animation_preview.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_avatar_picker.xml9
-rw-r--r--indra/newview/skins/default/xui/de/floater_avatar_textures.xml10
-rw-r--r--indra/newview/skins/default/xui/de/floater_bulk_perms.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_buy_currency.xml5
-rw-r--r--indra/newview/skins/default/xui/de/floater_buy_land.xml25
-rw-r--r--indra/newview/skins/default/xui/de/floater_day_cycle_options.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_god_tools.xml20
-rw-r--r--indra/newview/skins/default/xui/de/floater_image_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_inspect.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_lsl_guide.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_media_browser.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_mem_leaking.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_openobject.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_pay_object.xml8
-rw-r--r--indra/newview/skins/default/xui/de/floater_postcard.xml10
-rw-r--r--indra/newview/skins/default/xui/de/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_preview_gesture.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_report_abuse.xml5
-rw-r--r--indra/newview/skins/default/xui/de/floater_script_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_sell_land.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_snapshot.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_stats.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_telehub.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_tools.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_url_entry.xml8
-rw-r--r--indra/newview/skins/default/xui/de/floater_water.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_whitelist_entry.xml2
-rw-r--r--indra/newview/skins/default/xui/de/inspect_avatar.xml4
-rw-r--r--indra/newview/skins/default/xui/de/inspect_group.xml2
-rw-r--r--indra/newview/skins/default/xui/de/inspect_object.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_alpha.xml12
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_tattoo.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_invite.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_land_money.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_roles.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_groups.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_login.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_media_settings_security.xml3
-rw-r--r--indra/newview/skins/default/xui/de/panel_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_notes.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_places.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_advanced.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_general.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_privacy.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_profile.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_profile_view.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_covenant.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_texture.xml16
-rw-r--r--indra/newview/skins/default/xui/de/panel_script_limits_my_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_script_limits_region_memory.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_side_tray.xml14
-rw-r--r--indra/newview/skins/default/xui/en/floater_about.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_about_land.xml11
-rw-r--r--indra/newview/skins/default/xui/en/floater_camera.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_event.xml243
-rw-r--r--indra/newview/skins/default/xui/en/floater_help_browser.xml14
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_container.xml7
-rw-r--r--indra/newview/skins/default/xui/en/floater_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml29
-rw-r--r--indra/newview/skins/default/xui/en/floater_map.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_outgoing_call.xml17
-rw-r--r--indra/newview/skins/default/xui/en/floater_postcard.xml14
-rw-r--r--indra/newview/skins/default/xui/en/floater_search.xml18
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_inspectors.xml9
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_text_editor.xml13
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml68
-rw-r--r--indra/newview/skins/default/xui/en/floater_world_map.xml24
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory_add.xml22
-rw-r--r--indra/newview/skins/default/xui/en/menu_object.xml20
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml39
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml54
-rw-r--r--indra/newview/skins/default/xui/en/panel_active_object_row.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_chat_header.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_classified_info.xml44
-rw-r--r--indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_classified.xml56
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_pick.xml47
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_general.xml75
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml64
-rw-r--r--indra/newview/skins/default/xui/en/panel_im_control_panel.xml11
-rw-r--r--indra/newview/skins/default/xui/en/panel_instant_message.xml10
-rw-r--r--indra/newview/skins/default/xui/en/panel_landmark_info.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_main_inventory.xml28
-rw-r--r--indra/newview/skins/default/xui/en/panel_navigation_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_pick_info.xml34
-rw-r--r--indra/newview/skins/default/xui/en/panel_pick_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_picks.xml41
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_chat.xml62
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_privacy.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_sound.xml14
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_general.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_volume_pulldown.xml4
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml6
-rw-r--r--indra/newview/skins/default/xui/en/widgets/button.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/filter_editor.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/inspector.xml15
-rw-r--r--indra/newview/skins/default/xui/en/widgets/location_input.xml9
-rw-r--r--indra/newview/skins/default/xui/en/widgets/search_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/en/widgets/tab_container.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/text_editor.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/tool_tip.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about_land.xml32
-rw-r--r--indra/newview/skins/default/xui/fr/floater_avatar_picker.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_avatar_textures.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_buy_currency.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/floater_buy_land.xml21
-rw-r--r--indra/newview/skins/default/xui/fr/floater_color_picker.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml16
-rw-r--r--indra/newview/skins/default/xui/fr/floater_env_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_god_tools.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_inspect.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_joystick.xml28
-rw-r--r--indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_lsl_guide.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/floater_media_browser.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_mem_leaking.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_notification.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_pay_object.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_perm_prefs.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_postcard.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_report_abuse.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_sell_land.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_settings_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_snapshot.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_telehub.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/floater_url_entry.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_water.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/floater_windlight_options.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/inspect_remote_object.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_audio_device.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_alpha.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_gloves.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_jacket.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_pants.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_shirt.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_shoes.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_skin.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_skirt.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_socks.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_tattoo.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_underpants.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_wearable.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_land_money.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_notices.xml16
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_roles.xml12
-rw-r--r--indra/newview/skins/default/xui/fr/panel_groups.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_login.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_media_settings_security.xml3
-rw-r--r--indra/newview/skins/default/xui/fr/panel_nearby_chat.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_notes.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_setup.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_profile.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_covenant.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_estate.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_general.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_general_layout.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_texture.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_script_limits_my_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_script_limits_region_memory.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_side_tray.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/strings.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about_land.xml50
-rw-r--r--indra/newview/skins/default/xui/ja/floater_animation_preview.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/floater_avatar_textures.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_build_options.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_bulk_perms.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_contents.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_currency.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_land.xml20
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_object.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_camera.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_color_picker.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_critical.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_customize.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_god_tools.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_image_preview.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_inspect.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_joystick.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_land_holdings.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_map.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_media_browser.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_mem_leaking.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_perm_prefs.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_postcard.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preferences.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_gesture.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_sound.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_report_abuse.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_sell_land.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_snapshot.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_sound_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_telehub.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_tools.xml40
-rw-r--r--indra/newview/skins/default/xui/ja/floater_url_entry.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_window_size.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_world_map.xml22
-rw-r--r--indra/newview/skins/default/xui/ja/menu_avatar_self.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inventory.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/menu_login.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_object.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_groups.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_slurl.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_viewer.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/mime_types.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_bottomtray.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_alpha.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_friends.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_control_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_general.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_invite.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_land_money.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_notices.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_groups.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_landmark_info.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_landmarks.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_login.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_main_inventory.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_media_settings_general.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_media_settings_security.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_my_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_navigation_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_notes.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_people.xml22
-rw-r--r--indra/newview/skins/default/xui/ja/panel_picks.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_place_profile.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_chat.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_general.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_covenant.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_debug.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_estate.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_general.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_general_layout.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_texture.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_side_tray.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_status_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/strings.xml18
-rw-r--r--indra/newview/tests/lllogininstance_test.cpp2
-rw-r--r--indra/newview/tests/llxmlrpclistener_test.cpp2
-rwxr-xr-xindra/newview/viewer_manifest.py9
-rw-r--r--indra/test_apps/llplugintest/llmediaplugintest.cpp4
-rw-r--r--install.xml190
582 files changed, 9707 insertions, 4442 deletions
diff --git a/.hgignore b/.hgignore
index 53ddf71bb7..94127df2d1 100644
--- a/.hgignore
+++ b/.hgignore
@@ -9,6 +9,7 @@ syntax: glob
.*.swp
#OSX image cache file
*.DS_Store
+*.orig
LICENSES
indra/.distcc
indra/build-darwin-*
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index 592e9fc901..49a1ec7f2c 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -49,11 +49,12 @@ if (WINDOWS)
add_definitions(
/DLL_WINDOWS=1
+ /DDOM_DYNAMIC
/DUNICODE
/D_UNICODE
/GS
/TP
- /W3
+ /W2
/c
/Zc:forScope
/nologo
@@ -207,7 +208,7 @@ if (LINUX OR DARWIN)
set(GCC_WARNINGS "${GCC_WARNINGS} -Werror")
endif (NOT GCC_DISABLE_FATAL_WARNINGS)
- set(GCC_CXX_WARNINGS "${GCC_WARNINGS} -Wno-reorder -Wno-non-virtual-dtor -Woverloaded-virtual")
+ set(GCC_CXX_WARNINGS "${GCC_WARNINGS} -Wno-reorder -Wno-non-virtual-dtor")
set(CMAKE_C_FLAGS "${GCC_WARNINGS} ${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${GCC_CXX_WARNINGS} ${CMAKE_CXX_FLAGS}")
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index faf9da8b14..c9dc301b8b 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -19,7 +19,7 @@ if(WINDOWS)
set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-win32")
set(vivox_files
SLVoice.exe
- libsndfile-1.dll
+ libsndfile-1.dll
vivoxplatform.dll
vivoxsdk.dll
ortp.dll
@@ -38,6 +38,8 @@ if(WINDOWS)
libapr-1.dll
libaprutil-1.dll
libapriconv-1.dll
+ libcollada14dom21.dll
+ glod.dll
)
# *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
@@ -48,6 +50,8 @@ if(WINDOWS)
libapr-1.dll
libaprutil-1.dll
libapriconv-1.dll
+ libcollada14dom21.dll
+ glod.dll
)
if(USE_GOOGLE_PERFTOOLS)
diff --git a/indra/cmake/LLPrimitive.cmake b/indra/cmake/LLPrimitive.cmake
index d397b78f1c..9f8d99a0bf 100644
--- a/indra/cmake/LLPrimitive.cmake
+++ b/indra/cmake/LLPrimitive.cmake
@@ -1,7 +1,27 @@
# -*- cmake -*-
+# these should be moved to their own cmake file
+include(Prebuilt)
+use_prebuilt_binary(colladadom)
+use_prebuilt_binary(pcre)
+use_prebuilt_binary(libxml)
+
set(LLPRIMITIVE_INCLUDE_DIRS
${LIBS_OPEN_DIR}/llprimitive
)
-set(LLPRIMITIVE_LIBRARIES llprimitive)
+if (WINDOWS)
+ set(LLPRIMITIVE_LIBRARIES
+ llprimitive
+ libcollada14dom21
+ )
+else (WINDOWS)
+ set(LLPRIMITIVE_LIBRARIES
+ llprimitive
+ collada14dom
+ xml2
+ pcrecpp
+ pcre
+ )
+endif (WINDOWS)
+
diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake
index db0b44eb8f..9b1f7024bf 100644
--- a/indra/cmake/Variables.cmake
+++ b/indra/cmake/Variables.cmake
@@ -79,7 +79,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
# NOTE: wont have a distributable build unless you add this on the configure line with:
# -DCMAKE_OSX_ARCHITECTURES:STRING='i386;ppc'
#set(CMAKE_OSX_ARCHITECTURES i386;ppc)
- set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.4u.sdk)
+ set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.5.sdk)
if (CMAKE_OSX_ARCHITECTURES MATCHES "i386" AND CMAKE_OSX_ARCHITECTURES MATCHES "ppc")
set(ARCH universal)
else (CMAKE_OSX_ARCHITECTURES MATCHES "i386" AND CMAKE_OSX_ARCHITECTURES MATCHES "ppc")
diff --git a/indra/llcharacter/llcharacter.cpp b/indra/llcharacter/llcharacter.cpp
index 528a7bb4a5..40a9752268 100644
--- a/indra/llcharacter/llcharacter.cpp
+++ b/indra/llcharacter/llcharacter.cpp
@@ -181,16 +181,18 @@ void LLCharacter::requestStopMotion( LLMotion* motion)
// updateMotions()
//-----------------------------------------------------------------------------
static LLFastTimer::DeclareTimer FTM_UPDATE_ANIMATION("Update Animation");
+static LLFastTimer::DeclareTimer FTM_UPDATE_HIDDEN_ANIMATION("Update Hidden Anim");
void LLCharacter::updateMotions(e_update_t update_type)
{
- LLFastTimer t(FTM_UPDATE_ANIMATION);
if (update_type == HIDDEN_UPDATE)
{
+ LLFastTimer t(FTM_UPDATE_HIDDEN_ANIMATION);
mMotionController.updateMotionsMinimal();
}
else
{
+ LLFastTimer t(FTM_UPDATE_ANIMATION);
// unpause if the number of outstanding pause requests has dropped to the initial one
if (mMotionController.isPaused() && mPauseRequest->getNumRefs() == 1)
{
diff --git a/indra/llcharacter/lleditingmotion.cpp b/indra/llcharacter/lleditingmotion.cpp
index 381d19e614..57554bdc35 100644
--- a/indra/llcharacter/lleditingmotion.cpp
+++ b/indra/llcharacter/lleditingmotion.cpp
@@ -221,7 +221,7 @@ BOOL LLEditingMotion::onUpdate(F32 time, U8* joint_mask)
if (!target.isFinite())
{
llerrs << "Non finite target in editing motion with target distance of " << target_dist <<
- " and focus point " << focus_pt << " and pointAtPt: " << *pointAtPt << llendl;
+ " and focus point " << focus_pt << llendl;
}
mTarget.setPosition( target + mParentJoint.getPosition());
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index 9ead183a9e..4481d334b2 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -50,6 +50,7 @@ set(llcommon_SOURCE_FILES
lleventdispatcher.cpp
lleventfilter.cpp
llevents.cpp
+ lleventtimer.cpp
llfasttimer_class.cpp
llfile.cpp
llfindlocale.cpp
@@ -164,7 +165,6 @@ set(llcommon_HEADER_FILES
llhttpstatuscodes.h
llindexedqueue.h
llinstancetracker.h
- llinstancetracker.h
llkeythrottle.h
lllazy.h
lllistenerwrapper.h
diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp
index 968b92d1e7..6b2d1b7c20 100644
--- a/indra/llcommon/llapp.cpp
+++ b/indra/llcommon/llapp.cpp
@@ -41,7 +41,7 @@
#include "lllivefile.h"
#include "llmemory.h"
#include "llstl.h" // for DeletePointer()
-#include "lltimer.h"
+#include "lleventtimer.h"
//
// Signal handling
diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp
index 6d5b12d840..3ea742957e 100644
--- a/indra/llcommon/llassettype.cpp
+++ b/indra/llcommon/llassettype.cpp
@@ -94,6 +94,8 @@ LLAssetDictionary::LLAssetDictionary()
addEntry(LLAssetType::AT_LINK, new AssetEntry("LINK", "link", "symbolic link", FALSE));
addEntry(LLAssetType::AT_LINK_FOLDER, new AssetEntry("FOLDER_LINK", "link_f", "symbolic folder link", FALSE));
+ addEntry(LLAssetType::AT_MESH, new AssetEntry("MESH", "mesh", "mesh", FALSE));
+
addEntry(LLAssetType::AT_NONE, new AssetEntry("NONE", "-1", NULL, FALSE));
};
diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h
index c7bbc2e74a..3304258000 100644
--- a/indra/llcommon/llassettype.h
+++ b/indra/llcommon/llassettype.h
@@ -114,8 +114,11 @@ public:
AT_LINK_FOLDER = 25,
// Inventory folder link
-
- AT_COUNT = 26,
+
+ AT_MESH = 49,
+ // Mesh data in our proprietary SLM format
+
+ AT_COUNT = 50,
// +*********************************************************+
// | TO ADD AN ELEMENT TO THIS ENUM: |
diff --git a/indra/llcommon/lleventtimer.cpp b/indra/llcommon/lleventtimer.cpp
new file mode 100644
index 0000000000..d44e7ec1e6
--- /dev/null
+++ b/indra/llcommon/lleventtimer.cpp
@@ -0,0 +1,95 @@
+/**
+ * @file lleventtimer.cpp
+ * @brief Cross-platform objects for doing timing
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "lleventtimer.h"
+
+#include "u64.h"
+
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// LLEventTimer Implementation
+//
+//////////////////////////////////////////////////////////////////////////////
+
+LLEventTimer::LLEventTimer(F32 period)
+: mEventTimer()
+{
+ mPeriod = period;
+}
+
+LLEventTimer::LLEventTimer(const LLDate& time)
+: mEventTimer()
+{
+ mPeriod = (F32)(time.secondsSinceEpoch() - LLDate::now().secondsSinceEpoch());
+}
+
+
+LLEventTimer::~LLEventTimer()
+{
+}
+
+//static
+void LLEventTimer::updateClass()
+{
+ std::list<LLEventTimer*> completed_timers;
+
+ {
+ 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 );
+ }
+ }
+ }
+ }
+
+ if ( completed_timers.size() > 0 )
+ {
+ for (std::list<LLEventTimer*>::iterator completed_iter = completed_timers.begin();
+ completed_iter != completed_timers.end();
+ completed_iter++ )
+ {
+ delete *completed_iter;
+ }
+ }
+}
+
+
diff --git a/indra/llcommon/lleventtimer.h b/indra/llcommon/lleventtimer.h
new file mode 100644
index 0000000000..5181cce52d
--- /dev/null
+++ b/indra/llcommon/lleventtimer.h
@@ -0,0 +1,60 @@
+/**
+ * @file lleventtimer.h
+ * @brief Cross-platform objects for doing timing
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_EVENTTIMER_H
+#define LL_EVENTTIMER_H
+
+#include "stdtypes.h"
+#include "lldate.h"
+#include "llinstancetracker.h"
+#include "lltimer.h"
+
+// class for scheduling a function to be called at a given frequency (approximate, inprecise)
+class LL_COMMON_API LLEventTimer : protected LLInstanceTracker<LLEventTimer>
+{
+public:
+ LLEventTimer(F32 period); // period is the amount of time between each call to tick() in seconds
+ LLEventTimer(const LLDate& time);
+ virtual ~LLEventTimer();
+
+ //function to be called at the supplied frequency
+ // Normally return FALSE; TRUE will delete the timer after the function returns.
+ virtual BOOL tick() = 0;
+
+ static void updateClass();
+
+protected:
+ LLTimer mEventTimer;
+ F32 mPeriod;
+};
+
+#endif //LL_EVENTTIMER_H
diff --git a/indra/llcommon/llfasttimer_class.cpp b/indra/llcommon/llfasttimer_class.cpp
index 6d8d81e114..2e5edb1f3b 100644
--- a/indra/llcommon/llfasttimer_class.cpp
+++ b/indra/llcommon/llfasttimer_class.cpp
@@ -218,9 +218,10 @@ 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 = DeclareTimer::beginInstances();
- it != DeclareTimer::endInstances();
+ for (DeclareTimer::instance_iter it = guard.beginInstances();
+ it != guard.endInstances();
++it)
{
// update cached pointer
@@ -371,20 +372,23 @@ void LLFastTimer::NamedTimer::buildHierarchy()
if (sCurFrameIndex < 0 ) return;
// set up initial tree
- for (instance_iter it = NamedTimer::beginInstances();
- it != endInstances();
- ++it)
{
- NamedTimer& timer = *it;
- if (&timer == NamedTimerFactory::instance().getRootTimer()) continue;
-
- // bootstrap tree construction by attaching to last timer to be on stack
- // when this timer was called
- if (timer.getFrameState().mLastCaller && timer.mParent == NamedTimerFactory::instance().getRootTimer())
+ NamedTimer::LLInstanceTrackerScopedGuard guard;
+ for (instance_iter it = guard.beginInstances();
+ it != guard.endInstances();
+ ++it)
{
- timer.setParent(timer.getFrameState().mLastCaller->mTimer);
- // no need to push up tree on first use, flag can be set spuriously
- timer.getFrameState().mMoveUpTree = false;
+ NamedTimer& timer = *it;
+ if (&timer == NamedTimerFactory::instance().getRootTimer()) continue;
+
+ // bootstrap tree construction by attaching to last timer to be on stack
+ // when this timer was called
+ if (timer.getFrameState().mLastCaller && timer.mParent == NamedTimerFactory::instance().getRootTimer())
+ {
+ timer.setParent(timer.getFrameState().mLastCaller->mTimer);
+ // no need to push up tree on first use, flag can be set spuriously
+ timer.getFrameState().mMoveUpTree = false;
+ }
}
}
@@ -486,18 +490,21 @@ void LLFastTimer::NamedTimer::resetFrame()
F64 total_time = 0;
LLSD sd;
- for (NamedTimer::instance_iter it = NamedTimer::beginInstances();
- it != NamedTimer::endInstances();
- ++it)
{
- NamedTimer& timer = *it;
- FrameState& info = timer.getFrameState();
- sd[timer.getName()]["Time"] = (LLSD::Real) (info.mSelfTimeCounter*iclock_freq);
- sd[timer.getName()]["Calls"] = (LLSD::Integer) info.mCalls;
-
- // computing total time here because getting the root timer's getCountHistory
- // doesn't work correctly on the first frame
- total_time = total_time + info.mSelfTimeCounter * iclock_freq;
+ NamedTimer::LLInstanceTrackerScopedGuard guard;
+ for (NamedTimer::instance_iter it = guard.beginInstances();
+ it != guard.endInstances();
+ ++it)
+ {
+ NamedTimer& timer = *it;
+ FrameState& info = timer.getFrameState();
+ sd[timer.getName()]["Time"] = (LLSD::Real) (info.mSelfTimeCounter*iclock_freq);
+ sd[timer.getName()]["Calls"] = (LLSD::Integer) info.mCalls;
+
+ // computing total time here because getting the root timer's getCountHistory
+ // doesn't work correctly on the first frame
+ total_time = total_time + info.mSelfTimeCounter * iclock_freq;
+ }
}
sd["Total"]["Time"] = (LLSD::Real) total_time;
@@ -531,21 +538,24 @@ void LLFastTimer::NamedTimer::resetFrame()
DeclareTimer::updateCachedPointers();
// reset for next frame
- for (NamedTimer::instance_iter it = NamedTimer::beginInstances();
- it != NamedTimer::endInstances();
- ++it)
{
- NamedTimer& timer = *it;
-
- FrameState& info = timer.getFrameState();
- info.mSelfTimeCounter = 0;
- info.mCalls = 0;
- info.mLastCaller = NULL;
- info.mMoveUpTree = false;
- // update parent pointer in timer state struct
- if (timer.mParent)
+ NamedTimer::LLInstanceTrackerScopedGuard guard;
+ for (NamedTimer::instance_iter it = guard.beginInstances();
+ it != guard.endInstances();
+ ++it)
{
- info.mParent = &timer.mParent->getFrameState();
+ NamedTimer& timer = *it;
+
+ FrameState& info = timer.getFrameState();
+ info.mSelfTimeCounter = 0;
+ info.mCalls = 0;
+ info.mLastCaller = NULL;
+ info.mMoveUpTree = false;
+ // update parent pointer in timer state struct
+ if (timer.mParent)
+ {
+ info.mParent = &timer.mParent->getFrameState();
+ }
}
}
@@ -575,20 +585,23 @@ void LLFastTimer::NamedTimer::reset()
}
// reset all history
- for (NamedTimer::instance_iter it = NamedTimer::beginInstances();
- it != NamedTimer::endInstances();
- ++it)
{
- NamedTimer& timer = *it;
- if (&timer != NamedTimerFactory::instance().getRootTimer())
+ NamedTimer::LLInstanceTrackerScopedGuard guard;
+ for (NamedTimer::instance_iter it = guard.beginInstances();
+ it != guard.endInstances();
+ ++it)
{
- timer.setParent(NamedTimerFactory::instance().getRootTimer());
+ NamedTimer& timer = *it;
+ if (&timer != NamedTimerFactory::instance().getRootTimer())
+ {
+ timer.setParent(NamedTimerFactory::instance().getRootTimer());
+ }
+
+ timer.mCountAverage = 0;
+ timer.mCallAverage = 0;
+ memset(timer.mCountHistory, 0, sizeof(U32) * HISTORY_NUM);
+ memset(timer.mCallHistory, 0, sizeof(U32) * HISTORY_NUM);
}
-
- timer.mCountAverage = 0;
- timer.mCallAverage = 0;
- memset(timer.mCountHistory, 0, sizeof(U32) * HISTORY_NUM);
- memset(timer.mCallHistory, 0, sizeof(U32) * HISTORY_NUM);
}
sLastFrameIndex = 0;
diff --git a/indra/llcommon/llfoldertype.cpp b/indra/llcommon/llfoldertype.cpp
index 2610fe9e6a..16ae4cddde 100644
--- a/indra/llcommon/llfoldertype.cpp
+++ b/indra/llcommon/llfoldertype.cpp
@@ -95,6 +95,9 @@ LLFolderDictionary::LLFolderDictionary()
addEntry(LLFolderType::FT_CURRENT_OUTFIT, new FolderEntry("current", TRUE));
addEntry(LLFolderType::FT_OUTFIT, new FolderEntry("outfit", FALSE));
addEntry(LLFolderType::FT_MY_OUTFITS, new FolderEntry("my_otfts", TRUE));
+
+ addEntry(LLFolderType::FT_MESH, new FolderEntry("mesh", TRUE));
+
addEntry(LLFolderType::FT_INBOX, new FolderEntry("inbox", TRUE));
addEntry(LLFolderType::FT_NONE, new FolderEntry("-1", FALSE));
diff --git a/indra/llcommon/llfoldertype.h b/indra/llcommon/llfoldertype.h
index 7aa77f7f7e..409112a04e 100644
--- a/indra/llcommon/llfoldertype.h
+++ b/indra/llcommon/llfoldertype.h
@@ -86,9 +86,11 @@ public:
FT_OUTFIT = 47,
FT_MY_OUTFITS = 48,
- FT_INBOX = 49,
+ FT_MESH = 49,
- FT_COUNT = 50,
+ FT_INBOX = 50,
+
+ FT_COUNT = 51,
FT_NONE = -1
};
diff --git a/indra/llcommon/llinstancetracker.cpp b/indra/llcommon/llinstancetracker.cpp
new file mode 100644
index 0000000000..c962cb5be1
--- /dev/null
+++ b/indra/llcommon/llinstancetracker.cpp
@@ -0,0 +1,20 @@
+/**
+ * @file lllinstancetracker.cpp
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "llinstancetracker.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+
+// llinstancetracker.h is presently header-only. This file exists only because our CMake
+// test macro ADD_BUILD_TEST requires it.
+int dummy = 0;
diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h
index 11fe523651..9df7998273 100644
--- a/indra/llcommon/llinstancetracker.h
+++ b/indra/llcommon/llinstancetracker.h
@@ -98,7 +98,10 @@ private:
mKey = key;
getMap_()[key] = static_cast<T*>(this);
}
- void remove_() { getMap_().erase(mKey); }
+ void remove_()
+ {
+ getMap_().erase(mKey);
+ }
static InstanceMap& getMap_()
{
@@ -129,31 +132,65 @@ public:
/// for completeness of analogy with the generic implementation
static T* getInstance(T* k) { return k; }
- static key_iter beginKeys() { return getSet_().begin(); }
- static key_iter endKeys() { return getSet_().end(); }
- static instance_iter beginInstances() { return instance_iter(getSet_().begin()); }
- static instance_iter endInstances() { return instance_iter(getSet_().end()); }
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
+ {
+ public:
+ LLInstanceTrackerScopedGuard()
+ {
+ ++sIterationNestDepth;
+ }
+
+ ~LLInstanceTrackerScopedGuard()
+ {
+ --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(); }
+ };
+
protected:
- LLInstanceTracker() { getSet_().insert(static_cast<T*>(this)); }
- virtual ~LLInstanceTracker() { getSet_().erase(static_cast<T*>(this)); }
+ 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()
+ {
+ // it's unsafe to delete instances of this type while all instances are being iterated over.
+ llassert(sIterationNestDepth == 0);
+ getSet_().erase(static_cast<T*>(this));
+ }
- LLInstanceTracker(const LLInstanceTracker& other) { getSet_().insert(static_cast<T*>(this)); }
+ LLInstanceTracker(const LLInstanceTracker& other)
+ {
+ //llassert(sIterationNestDepth == 0);
+ getSet_().insert(static_cast<T*>(this));
+ }
- static InstanceSet& getSet_() // called after getReady() but before go()
- {
- if (! sInstances)
- {
- sInstances = new InstanceSet;
- }
- return *sInstances;
- }
+ static InstanceSet& getSet_()
+ {
+ if (! sInstances)
+ {
+ sInstances = new InstanceSet;
+ }
+ return *sInstances;
+ }
static InstanceSet* sInstances;
+ static S32 sIterationNestDepth;
};
template <typename T, typename KEY> typename LLInstanceTracker<T, KEY>::InstanceMap* LLInstanceTracker<T, KEY>::sInstances = NULL;
template <typename T> typename LLInstanceTracker<T, T*>::InstanceSet* LLInstanceTracker<T, T*>::sInstances = NULL;
+template <typename T> S32 LLInstanceTracker<T, T*>::sIterationNestDepth = 0;
#endif
diff --git a/indra/llcommon/lllivefile.cpp b/indra/llcommon/lllivefile.cpp
index effda6c49c..5ca90d82ba 100644
--- a/indra/llcommon/lllivefile.cpp
+++ b/indra/llcommon/lllivefile.cpp
@@ -33,7 +33,7 @@
#include "lllivefile.h"
#include "llframetimer.h"
-#include "lltimer.h"
+#include "lleventtimer.h"
const F32 DEFAULT_CONFIG_FILE_REFRESH = 5.0f;
diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp
index 37370e44e7..0385569a02 100644
--- a/indra/llcommon/llthread.cpp
+++ b/indra/llcommon/llthread.cpp
@@ -62,6 +62,12 @@
//
//----------------------------------------------------------------------------
+#if !LL_DARWIN
+U32 ll_thread_local sThreadID = 0;
+#endif
+
+U32 LLThread::sIDIter = 0;
+
//
// Handed to the APR thread creation function
//
@@ -72,10 +78,14 @@ void *APR_THREAD_FUNC LLThread::staticRun(apr_thread_t *apr_threadp, void *datap
// Set thread state to running
threadp->mStatus = RUNNING;
+#if !LL_DARWIN
+ sThreadID = threadp->mID;
+#endif
+
// Run the user supplied function
threadp->run();
- llinfos << "LLThread::staticRun() Exiting: " << threadp->mName << llendl;
+ //llinfos << "LLThread::staticRun() Exiting: " << threadp->mName << llendl;
// We're done with the run function, this thread is done executing now.
threadp->mStatus = STOPPED;
@@ -90,6 +100,8 @@ LLThread::LLThread(const std::string& name, apr_pool_t *poolp) :
mAPRThreadp(NULL),
mStatus(STOPPED)
{
+ mID = ++sIDIter;
+
// Thread creation probably CAN be paranoid about APR being initialized, if necessary
if (poolp)
{
@@ -273,7 +285,7 @@ void LLThread::wakeLocked()
//============================================================================
LLMutex::LLMutex(apr_pool_t *poolp) :
- mAPRMutexp(NULL)
+ mAPRMutexp(NULL), mCount(0), mLockingThread(NO_THREAD)
{
//if (poolp)
//{
@@ -305,7 +317,18 @@ LLMutex::~LLMutex()
void LLMutex::lock()
{
+#if LL_DARWIN
+ if (mLockingThread == LLThread::currentID())
+#else
+ if (mLockingThread == sThreadID)
+#endif
+ { //redundant lock
+ mCount++;
+ return;
+ }
+
apr_thread_mutex_lock(mAPRMutexp);
+
#if MUTEX_DEBUG
// Have to have the lock before we can access the debug info
U32 id = LLThread::currentID();
@@ -313,10 +336,22 @@ void LLMutex::lock()
llerrs << "Already locked in Thread: " << id << llendl;
mIsLocked[id] = TRUE;
#endif
+
+#if LL_DARWIN
+ mLockingThread = LLThread::currentID();
+#else
+ mLockingThread = sThreadID;
+#endif
}
void LLMutex::unlock()
{
+ if (mCount > 0)
+ { //not the root unlock
+ mCount--;
+ return;
+ }
+
#if MUTEX_DEBUG
// Access the debug info while we have the lock
U32 id = LLThread::currentID();
@@ -324,6 +359,8 @@ void LLMutex::unlock()
llerrs << "Not locked in Thread: " << id << llendl;
mIsLocked[id] = FALSE;
#endif
+
+ mLockingThread = NO_THREAD;
apr_thread_mutex_unlock(mAPRMutexp);
}
@@ -341,6 +378,11 @@ bool LLMutex::isLocked()
}
}
+U32 LLMutex::lockingThread() const
+{
+ return mLockingThread;
+}
+
//============================================================================
LLCondition::LLCondition(apr_pool_t *poolp) :
diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h
index adef1a9192..5d5ecd62fc 100644
--- a/indra/llcommon/llthread.h
+++ b/indra/llcommon/llthread.h
@@ -1,263 +1,285 @@
-/**
- * @file llthread.h
- * @brief Base classes for thread, mutex and condition handling.
- *
- * $LicenseInfo:firstyear=2004&license=viewergpl$
- *
- * Copyright (c) 2004-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLTHREAD_H
-#define LL_LLTHREAD_H
-
-#include "llapp.h"
-#include "llapr.h"
-#include "apr_thread_cond.h"
-
-class LLThread;
-class LLMutex;
-class LLCondition;
-
-class LL_COMMON_API LLThread
-{
-public:
- typedef enum e_thread_status
- {
- STOPPED = 0, // The thread is not running. Not started, or has exited its run function
- RUNNING = 1, // The thread is currently running
- QUITTING= 2 // Someone wants this thread to quit
- } EThreadStatus;
-
- LLThread(const std::string& name, apr_pool_t *poolp = NULL);
- virtual ~LLThread(); // Warning! You almost NEVER want to destroy a thread unless it's in the STOPPED state.
- virtual void shutdown(); // stops the thread
-
- bool isQuitting() const { return (QUITTING == mStatus); }
- bool isStopped() const { return (STOPPED == mStatus); }
-
- static U32 currentID(); // Return ID of current thread
- static void yield(); // Static because it can be called by the main thread, which doesn't have an LLThread data structure.
-
-public:
- // PAUSE / RESUME functionality. See source code for important usage notes.
- // Called from MAIN THREAD.
- void pause();
- void unpause();
- bool isPaused() { return isStopped() || mPaused == TRUE; }
-
- // Cause the thread to wake up and check its condition
- void wake();
-
- // Same as above, but to be used when the condition is already locked.
- void wakeLocked();
-
- // Called from run() (CHILD THREAD). Pause the thread if requested until unpaused.
- void checkPause();
-
- // this kicks off the apr thread
- void start(void);
-
- apr_pool_t *getAPRPool() { return mAPRPoolp; }
- LLVolatileAPRPool* getLocalAPRFilePool() { return mLocalAPRFilePoolp ; }
-
-private:
- BOOL mPaused;
-
- // static function passed to APR thread creation routine
- static void *APR_THREAD_FUNC staticRun(apr_thread_t *apr_threadp, void *datap);
-
-protected:
- std::string mName;
- LLCondition* mRunCondition;
-
- apr_thread_t *mAPRThreadp;
- apr_pool_t *mAPRPoolp;
- BOOL mIsLocalPool;
- EThreadStatus mStatus;
-
- //a local apr_pool for APRFile operations in this thread. If it exists, LLAPRFile::sAPRFilePoolp should not be used.
- //Note: this pool is used by APRFile ONLY, do NOT use it for any other purposes.
- // otherwise it will cause severe memory leaking!!! --bao
- LLVolatileAPRPool *mLocalAPRFilePoolp ;
-
- void setQuitting();
-
- // virtual function overridden by subclass -- this will be called when the thread runs
- virtual void run(void) = 0;
-
- // virtual predicate function -- returns true if the thread should wake up, false if it should sleep.
- virtual bool runCondition(void);
-
- // Lock/Unlock Run Condition -- use around modification of any variable used in runCondition()
- inline void lockData();
- inline void unlockData();
-
- // This is the predicate that decides whether the thread should sleep.
- // It should only be called with mRunCondition locked, since the virtual runCondition() function may need to access
- // data structures that are thread-unsafe.
- bool shouldSleep(void) { return (mStatus == RUNNING) && (isPaused() || (!runCondition())); }
-
- // To avoid spurious signals (and the associated context switches) when the condition may or may not have changed, you can do the following:
- // mRunCondition->lock();
- // if(!shouldSleep())
- // mRunCondition->signal();
- // mRunCondition->unlock();
-};
-
-//============================================================================
-
-#define MUTEX_DEBUG (LL_DEBUG || LL_RELEASE_WITH_DEBUG_INFO)
-
-class LL_COMMON_API LLMutex
-{
-public:
- LLMutex(apr_pool_t *apr_poolp); // NULL pool constructs a new pool for the mutex
- ~LLMutex();
-
- void lock(); // blocks
- void unlock();
- bool isLocked(); // non-blocking, but does do a lock/unlock so not free
-
-protected:
- apr_thread_mutex_t *mAPRMutexp;
- apr_pool_t *mAPRPoolp;
- BOOL mIsLocalPool;
-#if MUTEX_DEBUG
- std::map<U32, BOOL> mIsLocked;
-#endif
-};
-
-// Actually a condition/mutex pair (since each condition needs to be associated with a mutex).
-class LL_COMMON_API LLCondition : public LLMutex
-{
-public:
- LLCondition(apr_pool_t *apr_poolp); // Defaults to global pool, could use the thread pool as well.
- ~LLCondition();
-
- void wait(); // blocks
- void signal();
- void broadcast();
-
-protected:
- apr_thread_cond_t *mAPRCondp;
-};
-
-class LLMutexLock
-{
-public:
- LLMutexLock(LLMutex* mutex)
- {
- mMutex = mutex;
- mMutex->lock();
- }
- ~LLMutexLock()
- {
- mMutex->unlock();
- }
-private:
- LLMutex* mMutex;
-};
-
-//============================================================================
-
-void LLThread::lockData()
-{
- mRunCondition->lock();
-}
-
-void LLThread::unlockData()
-{
- mRunCondition->unlock();
-}
-
-
-//============================================================================
-
-// see llmemory.h for LLPointer<> definition
-
-class LL_COMMON_API LLThreadSafeRefCount
-{
-public:
- static void initThreadSafeRefCount(); // creates sMutex
- static void cleanupThreadSafeRefCount(); // destroys sMutex
-
-private:
- static LLMutex* sMutex;
-
-private:
- LLThreadSafeRefCount(const LLThreadSafeRefCount&); // not implemented
- LLThreadSafeRefCount&operator=(const LLThreadSafeRefCount&); // not implemented
-
-protected:
- virtual ~LLThreadSafeRefCount(); // use unref()
-
-public:
- LLThreadSafeRefCount();
-
- void ref()
- {
- if (sMutex) sMutex->lock();
- mRef++;
- if (sMutex) sMutex->unlock();
- }
-
- S32 unref()
- {
- llassert(mRef >= 1);
- if (sMutex) sMutex->lock();
- S32 res = --mRef;
- if (sMutex) sMutex->unlock();
- if (0 == res)
- {
- delete this;
- return 0;
- }
- return res;
- }
- S32 getNumRefs() const
- {
- return mRef;
- }
-
-private:
- S32 mRef;
-};
-
-//============================================================================
-
-// Simple responder for self destructing callbacks
-// Pure virtual class
-class LL_COMMON_API LLResponder : public LLThreadSafeRefCount
-{
-protected:
- virtual ~LLResponder();
-public:
- virtual void completed(bool success) = 0;
-};
-
-//============================================================================
-
-#endif // LL_LLTHREAD_H
+/**
+ * @file llthread.h
+ * @brief Base classes for thread, mutex and condition handling.
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLTHREAD_H
+#define LL_LLTHREAD_H
+
+#include "llapp.h"
+#include "llapr.h"
+#include "apr_thread_cond.h"
+
+class LLThread;
+class LLMutex;
+class LLCondition;
+
+#if LL_WINDOWS
+#define ll_thread_local __declspec(thread)
+#else
+#define ll_thread_local __thread
+#endif
+
+class LL_COMMON_API LLThread
+{
+private:
+ static U32 sIDIter;
+
+public:
+ typedef enum e_thread_status
+ {
+ STOPPED = 0, // The thread is not running. Not started, or has exited its run function
+ RUNNING = 1, // The thread is currently running
+ QUITTING= 2 // Someone wants this thread to quit
+ } EThreadStatus;
+
+ LLThread(const std::string& name, apr_pool_t *poolp = NULL);
+ virtual ~LLThread(); // Warning! You almost NEVER want to destroy a thread unless it's in the STOPPED state.
+ virtual void shutdown(); // stops the thread
+
+ bool isQuitting() const { return (QUITTING == mStatus); }
+ bool isStopped() const { return (STOPPED == mStatus); }
+
+ static U32 currentID(); // Return ID of current thread
+ static void yield(); // Static because it can be called by the main thread, which doesn't have an LLThread data structure.
+
+public:
+ // PAUSE / RESUME functionality. See source code for important usage notes.
+ // Called from MAIN THREAD.
+ void pause();
+ void unpause();
+ bool isPaused() { return isStopped() || mPaused == TRUE; }
+
+ // Cause the thread to wake up and check its condition
+ void wake();
+
+ // Same as above, but to be used when the condition is already locked.
+ void wakeLocked();
+
+ // Called from run() (CHILD THREAD). Pause the thread if requested until unpaused.
+ void checkPause();
+
+ // this kicks off the apr thread
+ void start(void);
+
+ apr_pool_t *getAPRPool() { return mAPRPoolp; }
+ LLVolatileAPRPool* getLocalAPRFilePool() { return mLocalAPRFilePoolp ; }
+
+ U32 getID() const { return mID; }
+
+private:
+ BOOL mPaused;
+
+ // static function passed to APR thread creation routine
+ static void *APR_THREAD_FUNC staticRun(apr_thread_t *apr_threadp, void *datap);
+
+protected:
+ std::string mName;
+ LLCondition* mRunCondition;
+
+ apr_thread_t *mAPRThreadp;
+ apr_pool_t *mAPRPoolp;
+ BOOL mIsLocalPool;
+ EThreadStatus mStatus;
+ U32 mID;
+
+ //a local apr_pool for APRFile operations in this thread. If it exists, LLAPRFile::sAPRFilePoolp should not be used.
+ //Note: this pool is used by APRFile ONLY, do NOT use it for any other purposes.
+ // otherwise it will cause severe memory leaking!!! --bao
+ LLVolatileAPRPool *mLocalAPRFilePoolp ;
+
+ void setQuitting();
+
+ // virtual function overridden by subclass -- this will be called when the thread runs
+ virtual void run(void) = 0;
+
+ // virtual predicate function -- returns true if the thread should wake up, false if it should sleep.
+ virtual bool runCondition(void);
+
+ // Lock/Unlock Run Condition -- use around modification of any variable used in runCondition()
+ inline void lockData();
+ inline void unlockData();
+
+ // This is the predicate that decides whether the thread should sleep.
+ // It should only be called with mRunCondition locked, since the virtual runCondition() function may need to access
+ // data structures that are thread-unsafe.
+ bool shouldSleep(void) { return (mStatus == RUNNING) && (isPaused() || (!runCondition())); }
+
+ // To avoid spurious signals (and the associated context switches) when the condition may or may not have changed, you can do the following:
+ // mRunCondition->lock();
+ // if(!shouldSleep())
+ // mRunCondition->signal();
+ // mRunCondition->unlock();
+};
+
+//============================================================================
+
+#define MUTEX_DEBUG (LL_DEBUG || LL_RELEASE_WITH_DEBUG_INFO)
+
+class LL_COMMON_API LLMutex
+{
+public:
+ typedef enum
+ {
+ NO_THREAD = 0xFFFFFFFF
+ } e_locking_thread;
+
+ LLMutex(apr_pool_t *apr_poolp); // NULL pool constructs a new pool for the mutex
+ ~LLMutex();
+
+ void lock(); // blocks
+ void unlock();
+ bool isLocked(); // non-blocking, but does do a lock/unlock so not free
+ U32 lockingThread() const; //get ID of locking thread
+
+protected:
+ apr_thread_mutex_t *mAPRMutexp;
+ mutable U32 mCount;
+ mutable U32 mLockingThread;
+
+ apr_pool_t *mAPRPoolp;
+ BOOL mIsLocalPool;
+
+#if MUTEX_DEBUG
+ std::map<U32, BOOL> mIsLocked;
+#endif
+};
+
+// Actually a condition/mutex pair (since each condition needs to be associated with a mutex).
+class LL_COMMON_API LLCondition : public LLMutex
+{
+public:
+ LLCondition(apr_pool_t *apr_poolp); // Defaults to global pool, could use the thread pool as well.
+ ~LLCondition();
+
+ void wait(); // blocks
+ void signal();
+ void broadcast();
+
+protected:
+ apr_thread_cond_t *mAPRCondp;
+};
+
+class LLMutexLock
+{
+public:
+ LLMutexLock(LLMutex* mutex)
+ {
+ mMutex = mutex;
+ mMutex->lock();
+ }
+ ~LLMutexLock()
+ {
+ mMutex->unlock();
+ }
+private:
+ LLMutex* mMutex;
+};
+
+//============================================================================
+
+void LLThread::lockData()
+{
+ mRunCondition->lock();
+}
+
+void LLThread::unlockData()
+{
+ mRunCondition->unlock();
+}
+
+
+//============================================================================
+
+// see llmemory.h for LLPointer<> definition
+
+class LL_COMMON_API LLThreadSafeRefCount
+{
+public:
+ static void initThreadSafeRefCount(); // creates sMutex
+ static void cleanupThreadSafeRefCount(); // destroys sMutex
+
+private:
+ static LLMutex* sMutex;
+
+private:
+ LLThreadSafeRefCount(const LLThreadSafeRefCount&); // not implemented
+ LLThreadSafeRefCount&operator=(const LLThreadSafeRefCount&); // not implemented
+
+protected:
+ virtual ~LLThreadSafeRefCount(); // use unref()
+
+public:
+ LLThreadSafeRefCount();
+
+ void ref()
+ {
+ if (sMutex) sMutex->lock();
+ mRef++;
+ if (sMutex) sMutex->unlock();
+ }
+
+ S32 unref()
+ {
+ llassert(mRef >= 1);
+ if (sMutex) sMutex->lock();
+ S32 res = --mRef;
+ if (sMutex) sMutex->unlock();
+ if (0 == res)
+ {
+ delete this;
+ return 0;
+ }
+ return res;
+ }
+ S32 getNumRefs() const
+ {
+ return mRef;
+ }
+
+private:
+ S32 mRef;
+};
+
+//============================================================================
+
+// Simple responder for self destructing callbacks
+// Pure virtual class
+class LL_COMMON_API LLResponder : public LLThreadSafeRefCount
+{
+protected:
+ virtual ~LLResponder();
+public:
+ virtual void completed(bool success) = 0;
+};
+
+//============================================================================
+
+#endif // LL_LLTHREAD_H
diff --git a/indra/llcommon/lltimer.cpp b/indra/llcommon/lltimer.cpp
index 21e165ebc9..25b768079b 100644
--- a/indra/llcommon/lltimer.cpp
+++ b/indra/llcommon/lltimer.cpp
@@ -555,60 +555,3 @@ void secondsToTimecodeString(F32 current_time, std::string& tcstring)
}
-//////////////////////////////////////////////////////////////////////////////
-//
-// LLEventTimer Implementation
-//
-//////////////////////////////////////////////////////////////////////////////
-
-LLEventTimer::LLEventTimer(F32 period)
-: mEventTimer()
-{
- mPeriod = period;
- mBusy = false;
-}
-
-LLEventTimer::LLEventTimer(const LLDate& time)
-: mEventTimer()
-{
- mPeriod = (F32)(time.secondsSinceEpoch() - LLDate::now().secondsSinceEpoch());
- mBusy = false;
-}
-
-
-LLEventTimer::~LLEventTimer()
-{
- llassert(!mBusy); // this LLEventTimer was destroyed from within its own tick() function - bad. if you want tick() to cause destruction of its own timer, make it return true.
-}
-
-//static
-void LLEventTimer::updateClass()
-{
- std::list<LLEventTimer*> completed_timers;
- for (instance_iter iter = beginInstances(); iter != endInstances(); )
- {
- LLEventTimer& timer = *iter++;
- F32 et = timer.mEventTimer.getElapsedTimeF32();
- if (timer.mEventTimer.getStarted() && et > timer.mPeriod) {
- timer.mEventTimer.reset();
- timer.mBusy = true;
- if ( timer.tick() )
- {
- completed_timers.push_back( &timer );
- }
- timer.mBusy = false;
- }
- }
-
- if ( completed_timers.size() > 0 )
- {
- for (std::list<LLEventTimer*>::iterator completed_iter = completed_timers.begin();
- completed_iter != completed_timers.end();
- completed_iter++ )
- {
- delete *completed_iter;
- }
- }
-}
-
-
diff --git a/indra/llcommon/lltimer.h b/indra/llcommon/lltimer.h
index 4d995d5bba..baba95bfa1 100644
--- a/indra/llcommon/lltimer.h
+++ b/indra/llcommon/lltimer.h
@@ -39,8 +39,6 @@
#include <limits.h>
#include "stdtypes.h"
-#include "lldate.h"
-#include "llinstancetracker.h"
#include <string>
#include <list>
@@ -171,26 +169,6 @@ LL_COMMON_API struct tm* utc_to_pacific_time(time_t utc_time, BOOL pacific_dayli
LL_COMMON_API void microsecondsToTimecodeString(U64 current_time, std::string& tcstring);
LL_COMMON_API void secondsToTimecodeString(F32 current_time, std::string& tcstring);
-// class for scheduling a function to be called at a given frequency (approximate, inprecise)
-class LL_COMMON_API LLEventTimer : protected LLInstanceTracker<LLEventTimer>
-{
-public:
- LLEventTimer(F32 period); // period is the amount of time between each call to tick() in seconds
- LLEventTimer(const LLDate& time);
- virtual ~LLEventTimer();
-
- //function to be called at the supplied frequency
- // Normally return FALSE; TRUE will delete the timer after the function returns.
- virtual BOOL tick() = 0;
-
- static void updateClass();
-
-protected:
- LLTimer mEventTimer;
- F32 mPeriod;
- bool mBusy;
-};
-
U64 LL_COMMON_API totalTime(); // Returns current system time in microseconds
#endif
diff --git a/indra/llcommon/stdenums.h b/indra/llcommon/stdenums.h
index 1a5678dde1..6eead924da 100644
--- a/indra/llcommon/stdenums.h
+++ b/indra/llcommon/stdenums.h
@@ -55,7 +55,8 @@ enum EDragAndDropType
DAD_ANIMATION = 12,
DAD_GESTURE = 13,
DAD_LINK = 14,
- DAD_COUNT = 15, // number of types in this enum
+ DAD_MESH = 15,
+ DAD_COUNT = 16, // number of types in this enum
};
// Reasons for drags to be denied.
diff --git a/indra/llcommon/tests/llinstancetracker_test.cpp b/indra/llcommon/tests/llinstancetracker_test.cpp
index 7415f2d33b..4bb3ec2922 100644
--- a/indra/llcommon/tests/llinstancetracker_test.cpp
+++ b/indra/llcommon/tests/llinstancetracker_test.cpp
@@ -138,23 +138,29 @@ namespace tut
keys.insert(&one);
keys.insert(&two);
keys.insert(&three);
- for (Unkeyed::key_iter ki(Unkeyed::beginKeys()), kend(Unkeyed::endKeys());
- ki != kend; ++ki)
- {
- ensure_equals("spurious key", keys.erase(*ki), 1);
- }
+ {
+ 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);
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);
- }
+ {
+ 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);
}
} // namespace tut
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index e02be6c8c1..5649b4cab7 100644
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -676,9 +676,6 @@ void LLImageRaw::copy(LLImageRaw* src)
LLImageRaw* dst = this; // Just for clarity.
- llassert( (3 == src->getComponents()) || (4 == src->getComponents()) );
- llassert( (3 == dst->getComponents()) || (4 == dst->getComponents()) );
-
if( (src->getWidth() == dst->getWidth()) && (src->getHeight() == dst->getHeight()) )
{
// No scaling needed
diff --git a/indra/llinventory/llinventorytype.cpp b/indra/llinventory/llinventorytype.cpp
index 4ef5df0b28..c268625064 100644
--- a/indra/llinventory/llinventorytype.cpp
+++ b/indra/llinventory/llinventorytype.cpp
@@ -89,6 +89,8 @@ LLInventoryDictionary::LLInventoryDictionary()
addEntry(LLInventoryType::IT_WEARABLE, new InventoryEntry("wearable", "wearable", 2, LLAssetType::AT_CLOTHING, LLAssetType::AT_BODYPART));
addEntry(LLInventoryType::IT_ANIMATION, new InventoryEntry("animation", "animation", 1, LLAssetType::AT_ANIMATION));
addEntry(LLInventoryType::IT_GESTURE, new InventoryEntry("gesture", "gesture", 1, LLAssetType::AT_GESTURE));
+ addEntry(LLInventoryType::IT_MESH, new InventoryEntry("mesh", "mesh", 1, LLAssetType::AT_MESH));
+
}
@@ -123,6 +125,33 @@ DEFAULT_ASSET_FOR_INV_TYPE[LLAssetType::AT_COUNT] =
LLInventoryType::IT_NONE, // AT_LINK
LLInventoryType::IT_NONE, // AT_LINK_FOLDER
+
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+ LLInventoryType::IT_NONE, // AT_NONE
+
+ LLInventoryType::IT_MESH // AT_MESH
};
// static
diff --git a/indra/llinventory/llinventorytype.h b/indra/llinventory/llinventorytype.h
index e515b8a304..af426b9007 100644
--- a/indra/llinventory/llinventorytype.h
+++ b/indra/llinventory/llinventorytype.h
@@ -67,7 +67,9 @@ public:
IT_WEARABLE = 18,
IT_ANIMATION = 19,
IT_GESTURE = 20,
- IT_COUNT = 21,
+
+ IT_MESH = 22,
+ IT_COUNT = 23,
IT_NONE = -1
};
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index df4c618ac1..7fd9b57f51 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -46,6 +46,9 @@
#include "lldarray.h"
#include "llvolume.h"
#include "llstl.h"
+#include "llsdserialize.h"
+#include "zlib/zlib.h"
+
#define DEBUG_SILHOUETTE_BINORMALS 0
#define DEBUG_SILHOUETTE_NORMALS 0 // TomY: Use this to display normals using the silhouette
@@ -1673,7 +1676,9 @@ LLVolume::LLVolume(const LLVolumeParams &params, const F32 detail, const BOOL ge
mFaceMask = 0x0;
mDetail = detail;
mSculptLevel = -2;
-
+ mIsTetrahedron = FALSE;
+ mLODScaleBias.setVec(1,1,1);
+
// set defaults
if (mParams.getPathParams().getCurveType() == LL_PCODE_PATH_FLEXIBLE)
{
@@ -1688,7 +1693,8 @@ LLVolume::LLVolume(const LLVolumeParams &params, const F32 detail, const BOOL ge
mGenerateSingleFace = generate_single_face;
generate();
- if (mParams.getSculptID().isNull())
+
+ if (mParams.getSculptID().isNull() && mParams.getSculptType() == LL_SCULPT_TYPE_NONE)
{
createVolumeFaces();
}
@@ -1839,6 +1845,480 @@ BOOL LLVolume::generate()
return FALSE;
}
+bool LLVolumeFace::VertexData::operator<(const LLVolumeFace::VertexData& rhs)const
+{
+ const U8* l = (const U8*) this;
+ const U8* r = (const U8*) &rhs;
+
+ for (U32 i = 0; i < sizeof(VertexData); ++i)
+ {
+ if (l[i] != r[i])
+ {
+ return r[i] < l[i];
+ }
+ }
+
+ return false;
+}
+
+bool LLVolumeFace::VertexData::operator==(const LLVolumeFace::VertexData& rhs)const
+{
+ const U8* l = (const U8*) this;
+ const U8* r = (const U8*) &rhs;
+
+ for (U32 i = 0; i < sizeof(VertexData); ++i)
+ {
+ if (l[i] != r[i])
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool LLVolumeFace::VertexData::compareNormal(const LLVolumeFace::VertexData& rhs, F32 angle_cutoff) const
+{
+ bool retval = false;
+ if (rhs.mPosition == mPosition && rhs.mTexCoord == mTexCoord)
+ {
+ F32 cur_angle = rhs.mNormal*mNormal;
+
+ retval = cur_angle > angle_cutoff;
+ }
+
+ return retval;
+}
+
+BOOL LLVolume::createVolumeFacesFromFile(const std::string& file_name)
+{
+ std::ifstream is;
+
+ is.open(file_name.c_str(), std::ifstream::in | std::ifstream::binary);
+
+ BOOL success = createVolumeFacesFromStream(is);
+
+ is.close();
+
+ return success;
+}
+
+BOOL LLVolume::createVolumeFacesFromStream(std::istream& is)
+{
+ mSculptLevel = -1; // default is an error occured
+
+ LLSD header;
+ {
+ if (!LLSDSerialize::deserialize(header, is, 1024*1024*1024))
+ {
+ llwarns << "Mesh header parse error. Not a valid mesh asset!" << llendl;
+ return FALSE;
+ }
+ }
+
+ std::string nm[] =
+ {
+ "impostor",
+ "low_lod",
+ "medium_lod",
+ "high_lod"
+ };
+
+ S32 lod = llclamp((S32) mDetail, 0, 3);
+
+ while (lod < 4 &&
+ (header[nm[lod]]["offset"].asInteger() == -1 ||
+ header[nm[lod]]["size"].asInteger() == 0 ))
+ {
+ ++lod;
+ }
+
+ if (lod >= 4)
+ {
+ lod = llclamp((S32) mDetail, 0, 3);
+
+ while (lod >= 0 &&
+ (header[nm[lod]]["offset"].asInteger() == -1 ||
+ header[nm[lod]]["size"].asInteger() == 0) )
+ {
+ --lod;
+ }
+
+ if (lod < 0)
+ {
+ llwarns << "Mesh header missing LOD offsets. Not a valid mesh asset!" << llendl;
+ return FALSE;
+ }
+ }
+
+ is.seekg(header[nm[lod]]["offset"].asInteger(), std::ios_base::cur);
+
+ return unpackVolumeFaces(is, header[nm[lod]]["size"].asInteger());
+}
+
+BOOL LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
+{
+ U8* result = NULL;
+ U32 cur_size = 0;
+
+ {
+ //input stream is now pointing at a zlib compressed block of LLSD
+ //decompress block
+ z_stream strm;
+
+ const U32 CHUNK = 65536;
+
+ U8 *in = new U8[size];
+ is.read((char*) in, size);
+
+ U8 out[CHUNK];
+
+ strm.zalloc = Z_NULL;
+ strm.zfree = Z_NULL;
+ strm.opaque = Z_NULL;
+ strm.avail_in = size;
+ strm.next_in = in;
+
+ S32 ret = inflateInit(&strm);
+
+ if (ret != Z_OK)
+ {
+ llerrs << "WTF?" << llendl;
+ }
+
+ do
+ {
+ strm.avail_out = CHUNK;
+ strm.next_out = out;
+ ret = inflate(&strm, Z_NO_FLUSH);
+ if (ret == Z_STREAM_ERROR)
+ {
+ inflateEnd(&strm);
+ free(result);
+ delete [] in;
+ return FALSE;
+ }
+
+ switch (ret)
+ {
+ case Z_NEED_DICT:
+ ret = Z_DATA_ERROR;
+ case Z_DATA_ERROR:
+ case Z_MEM_ERROR:
+ inflateEnd(&strm);
+ free(result);
+ delete [] in;
+ return FALSE;
+ break;
+ }
+
+ U32 have = CHUNK-strm.avail_out;
+
+ result = (U8*) realloc(result, cur_size + have);
+ memcpy(result+cur_size, out, have);
+ cur_size += have;
+
+ } while (strm.avail_out == 0);
+
+ inflateEnd(&strm);
+ delete [] in;
+
+ if (ret != Z_STREAM_END)
+ {
+ free(result);
+ return FALSE;
+ }
+ }
+
+ //result now points to the decompressed LLSD block
+
+ LLSD mdl;
+
+ {
+ std::string res_str((char*) result, cur_size);
+ std::istringstream istr(res_str);
+
+ if (!LLSDSerialize::deserialize(mdl, istr, cur_size))
+ {
+ llwarns << "not a valid mesh asset!" << llendl;
+ return FALSE;
+ }
+ }
+
+
+ free(result);
+
+
+ {
+ U32 face_count = mdl.size();
+
+ if (face_count == 0)
+ {
+ llerrs << "WTF?" << llendl;
+ }
+
+ mVolumeFaces.resize(face_count);
+
+ for (U32 i = 0; i < face_count; ++i)
+ {
+ LLSD::Binary pos = mdl[i]["Position"];
+ LLSD::Binary norm = mdl[i]["Normal"];
+ LLSD::Binary tc = mdl[i]["TexCoord0"];
+ LLSD::Binary idx = mdl[i]["TriangleList"];
+
+ LLVolumeFace& face = mVolumeFaces[i];
+
+ face.mHasBinormals = FALSE;
+
+ //copy out indices
+ face.mIndices.resize(idx.size()/2);
+ if (idx.empty() || face.mIndices.size() < 3)
+ { //why is there an empty index list?
+ llerrs <<"WTF?" << llendl;
+ continue;
+ }
+
+ U16* indices = (U16*) &(idx[0]);
+ for (U32 j = 0; j < idx.size()/2; ++j)
+ {
+ face.mIndices[j] = indices[j];
+ }
+
+ //copy out vertices
+ U32 num_verts = pos.size()/(3*2);
+ face.mVertices.resize(num_verts);
+
+ LLVector3 min_pos;
+ LLVector3 max_pos;
+ LLVector2 min_tc;
+ LLVector2 max_tc;
+
+ min_pos.setValue(mdl[i]["PositionDomain"]["Min"]);
+ max_pos.setValue(mdl[i]["PositionDomain"]["Max"]);
+ min_tc.setValue(mdl[i]["TexCoord0Domain"]["Min"]);
+ max_tc.setValue(mdl[i]["TexCoord0Domain"]["Max"]);
+
+ F32 scale = llclamp((F32) mdl[i]["Scale"].asReal(), 1.f, 10.f);
+
+ LLVector3 pos_range = max_pos - min_pos;
+ LLVector2 tc_range = max_tc - min_tc;
+
+ LLVector3& min = face.mExtents[0];
+ LLVector3& max = face.mExtents[1];
+
+ min = max = LLVector3(0,0,0);
+
+ for (U32 j = 0; j < num_verts; ++j)
+ {
+ U16* v = (U16*) &(pos[j*3*2]);
+
+ face.mVertices[j].mPosition.setVec(
+ (F32) v[0] / 65535.f * pos_range.mV[0] + min_pos.mV[0],
+ (F32) v[1] / 65535.f * pos_range.mV[1] + min_pos.mV[1],
+ (F32) v[2] / 65535.f * pos_range.mV[2] + min_pos.mV[2]);
+
+ face.mVertices[j].mPosition *= scale;
+
+ if (j == 0)
+ {
+ min = max = face.mVertices[j].mPosition;
+ }
+ else
+ {
+ update_min_max(min,max,face.mVertices[j].mPosition);
+ }
+
+ U16* n = (U16*) &(norm[j*3*2]);
+
+ face.mVertices[j].mNormal.setVec(
+ (F32) n[0] / 65535.f * 2.f - 1.f,
+ (F32) n[1] / 65535.f * 2.f - 1.f,
+ (F32) n[2] / 65535.f * 2.f - 1.f);
+
+ U16* t = (U16*) &(tc[j*2*2]);
+
+ face.mVertices[j].mTexCoord.setVec(
+ (F32) t[0] / 65535.f * tc_range.mV[0] + min_tc.mV[0],
+ (F32) t[1] / 65535.f * tc_range.mV[1] + min_tc.mV[1]);
+ }
+
+
+ // modifier flags?
+ BOOL do_mirror = (mParams.getSculptType() & LL_SCULPT_FLAG_MIRROR);
+ BOOL do_invert = (mParams.getSculptType() &LL_SCULPT_FLAG_INVERT);
+
+
+ // translate to actions:
+ BOOL do_reflect_x = FALSE;
+ BOOL do_reverse_triangles = FALSE;
+ BOOL do_invert_normals = FALSE;
+
+ if (do_mirror)
+ {
+ do_reflect_x = TRUE;
+ do_reverse_triangles = !do_reverse_triangles;
+ }
+
+ if (do_invert)
+ {
+ do_invert_normals = TRUE;
+ do_reverse_triangles = !do_reverse_triangles;
+ }
+
+ // now do the work
+
+ if (do_reflect_x)
+ {
+ for (S32 i = 0; i < face.mVertices.size(); i++)
+ {
+ face.mVertices[i].mPosition.mV[VX] *= -1.0f;
+ face.mVertices[i].mNormal.mV[VX] *= -1.0f;
+ }
+ }
+
+ if (do_invert_normals)
+ {
+ for (S32 i = 0; i < face.mVertices.size(); i++)
+ {
+ face.mVertices[i].mNormal *= -1.0f;
+ }
+ }
+
+ if (do_reverse_triangles)
+ {
+ for (U32 j = 0; j < face.mIndices.size(); j += 3)
+ {
+ // swap the 2nd and 3rd index
+ S32 swap = face.mIndices[j+1];
+ face.mIndices[j+1] = face.mIndices[j+2];
+ face.mIndices[j+2] = swap;
+ }
+ }
+
+ }
+ }
+
+ mSculptLevel = 0; // success!
+ return TRUE;
+}
+
+void tetrahedron_set_normal(LLVolumeFace::VertexData* cv)
+{
+ LLVector3 nrm = (cv[1].mPosition-cv[0].mPosition)%(cv[2].mPosition-cv[0].mPosition);
+
+ nrm.normVec();
+
+ cv[0].mNormal = nrm;
+ cv[1].mNormal = nrm;
+ cv[2].mNormal = nrm;
+}
+
+BOOL LLVolume::isTetrahedron()
+{
+ return mIsTetrahedron;
+}
+
+void LLVolume::makeTetrahedron()
+{
+ mVolumeFaces.clear();
+
+ LLVolumeFace face;
+
+ F32 x = 0.25f;
+ LLVector3 p[] =
+ { //unit tetrahedron corners
+ LLVector3(x,x,x),
+ LLVector3(-x,-x,x),
+ LLVector3(-x,x,-x),
+ LLVector3(x,-x,-x)
+ };
+
+ face.mExtents[0].setVec(-x,-x,-x);
+ face.mExtents[1].setVec(x,x,x);
+
+ LLVolumeFace::VertexData cv[3];
+
+ //set texture coordinates
+ cv[0].mTexCoord = LLVector2(0,0);
+ cv[1].mTexCoord = LLVector2(1,0);
+ cv[2].mTexCoord = LLVector2(0.5f, 0.5f*F_SQRT3);
+
+
+ //side 1
+ cv[0].mPosition = p[1];
+ cv[1].mPosition = p[0];
+ cv[2].mPosition = p[2];
+
+ tetrahedron_set_normal(cv);
+
+ face.mVertices.push_back(cv[0]);
+ face.mVertices.push_back(cv[1]);
+ face.mVertices.push_back(cv[2]);
+
+ //side 2
+ cv[0].mPosition = p[3];
+ cv[1].mPosition = p[0];
+ cv[2].mPosition = p[1];
+
+ tetrahedron_set_normal(cv);
+
+ face.mVertices.push_back(cv[0]);
+ face.mVertices.push_back(cv[1]);
+ face.mVertices.push_back(cv[2]);
+
+ //side 3
+ cv[0].mPosition = p[3];
+ cv[1].mPosition = p[1];
+ cv[2].mPosition = p[2];
+
+ tetrahedron_set_normal(cv);
+
+ face.mVertices.push_back(cv[0]);
+ face.mVertices.push_back(cv[1]);
+ face.mVertices.push_back(cv[2]);
+
+ //side 4
+ cv[0].mPosition = p[2];
+ cv[1].mPosition = p[0];
+ cv[2].mPosition = p[3];
+
+ tetrahedron_set_normal(cv);
+
+ face.mVertices.push_back(cv[0]);
+ face.mVertices.push_back(cv[1]);
+ face.mVertices.push_back(cv[2]);
+
+ //set index buffer
+ for (U32 i = 0; i < 12; i++)
+ {
+ face.mIndices.push_back(i);
+ }
+
+ mVolumeFaces.push_back(face);
+ mSculptLevel = 0;
+ mIsTetrahedron = TRUE;
+}
+
+void LLVolume::copyVolumeFaces(LLVolume* volume)
+{
+ mVolumeFaces = volume->mVolumeFaces;
+ mSculptLevel = 0;
+ mIsTetrahedron = FALSE;
+}
+
+
+S32 LLVolume::getNumFaces() const
+{
+ U8 sculpt_type = (mParams.getSculptType() & LL_SCULPT_TYPE_MASK);
+
+ if (sculpt_type == LL_SCULPT_TYPE_MESH)
+ {
+ return LL_SCULPT_MESH_MAX_FACES;
+ }
+
+ return (S32)mProfilep->mFaces.size();
+}
+
void LLVolume::createVolumeFaces()
{
@@ -1864,6 +2344,11 @@ void LLVolume::createVolumeFaces()
LLProfile::Face& face = mProfilep->mFaces[i];
vf.mBeginS = face.mIndex;
vf.mNumS = face.mCount;
+ if (vf.mNumS < 0)
+ {
+ llerrs << "Volume face corruption detected." << llendl;
+ }
+
vf.mBeginT = 0;
vf.mNumT= getPath().mPath.size();
vf.mID = i;
@@ -1907,6 +2392,10 @@ void LLVolume::createVolumeFaces()
if (face.mFlat && vf.mNumS > 2)
{ //flat inner faces have to copy vert normals
vf.mNumS = vf.mNumS*2;
+ if (vf.mNumS < 0)
+ {
+ llerrs << "Volume face corruption detected." << llendl;
+ }
}
}
else
@@ -2198,6 +2687,11 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components,
LLMemType m1(LLMemType::MTYPE_VOLUME);
U8 sculpt_type = mParams.getSculptType();
+ if (sculpt_type & LL_SCULPT_TYPE_MASK == LL_SCULPT_TYPE_MESH)
+ {
+ llerrs << "WTF?" << llendl;
+ }
+
BOOL data_is_empty = FALSE;
if (sculpt_width == 0 || sculpt_height == 0 || sculpt_components < 3 || sculpt_data == NULL)
@@ -2309,7 +2803,6 @@ bool LLVolumeParams::operator<(const LLVolumeParams &params) const
return mSculptID < params.mSculptID;
}
-
return mSculptType < params.mSculptType;
@@ -3367,6 +3860,20 @@ S32 LLVolume::getNumTriangleIndices() const
return count;
}
+
+S32 LLVolume::getNumTriangles() const
+{
+ U32 triangle_count = 0;
+
+ for (S32 i = 0; i < getNumVolumeFaces(); ++i)
+ {
+ triangle_count += getVolumeFace(i).mIndices.size()/3;
+ }
+
+ return triangle_count;
+}
+
+
//-----------------------------------------------------------------------------
// generateSilhouetteVertices()
//-----------------------------------------------------------------------------
@@ -3379,22 +3886,29 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
S32 face_mask)
{
LLMemType m1(LLMemType::MTYPE_VOLUME);
-
+
vertices.clear();
normals.clear();
segments.clear();
+ if ((mParams.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
+ {
+ return;
+ }
+
S32 cur_index = 0;
//for each face
for (face_list_t::iterator iter = mVolumeFaces.begin();
iter != mVolumeFaces.end(); ++iter)
{
- const LLVolumeFace& face = *iter;
+ LLVolumeFace& face = *iter;
- if (!(face_mask & (0x1 << cur_index++)))
+ if (!(face_mask & (0x1 << cur_index++)) ||
+ face.mIndices.empty() || face.mEdge.empty())
{
continue;
}
+
if (face.mTypeMask & (LLVolumeFace::CAP_MASK)) {
}
@@ -3594,6 +4108,8 @@ S32 LLVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
F32 closest_t = 2.f; // must be larger than 1
+ end_face = llmin(end_face, getNumVolumeFaces()-1);
+
for (S32 i = start_face; i <= end_face; i++)
{
const LLVolumeFace &face = getVolumeFace((U32)i);
@@ -3822,6 +4338,7 @@ BOOL LLVolume::cleanupTriangleData( const S32 num_input_vertices,
// Generate the vertex mapping and the list of vertices without
// duplicates. This will crash if there are no vertices.
+ llassert(num_input_vertices > 0); // check for no vertices!
S32 *vertex_mapping = new S32[num_input_vertices];
LLVector3 *new_vertices = new LLVector3[num_input_vertices];
LLVertexIndexPair *prev_pairp = NULL;
@@ -4103,11 +4620,28 @@ BOOL LLVolumeParams::exportLegacyStream(std::ostream& output_stream) const
return TRUE;
}
+LLSD LLVolumeParams::sculptAsLLSD() const
+{
+ LLSD sd = LLSD();
+ sd["id"] = getSculptID();
+ sd["type"] = getSculptType();
+
+ return sd;
+}
+
+bool LLVolumeParams::sculptFromLLSD(LLSD& sd)
+{
+ setSculptID(sd["id"].asUUID(), (U8)sd["type"].asInteger());
+ return true;
+}
+
LLSD LLVolumeParams::asLLSD() const
{
LLSD sd = LLSD();
sd["path"] = mPathParams;
sd["profile"] = mProfileParams;
+ sd["sculpt"] = sculptAsLLSD();
+
return sd;
}
@@ -4115,6 +4649,8 @@ bool LLVolumeParams::fromLLSD(LLSD& sd)
{
mPathParams.fromLLSD(sd["path"]);
mProfileParams.fromLLSD(sd["profile"]);
+ sculptFromLLSD(sd["sculpt"]);
+
return true;
}
@@ -4157,6 +4693,12 @@ const F32 MIN_CONCAVE_PATH_WEDGE = 0.111111f; // 1/9 unity
// for collison purposes
BOOL LLVolumeParams::isConvex() const
{
+ if (!getSculptID().isNull())
+ {
+ // can't determine, be safe and say no:
+ return FALSE;
+ }
+
F32 path_length = mPathParams.getEnd() - mPathParams.getBegin();
F32 hollow = mProfileParams.getHollow();
@@ -4520,15 +5062,65 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
if (!partial_build)
{
- int idxs[] = {0,1,(grid_size+1)+1,(grid_size+1)+1,(grid_size+1),0};
- for(int gx = 0;gx<grid_size;gx++){
- for(int gy = 0;gy<grid_size;gy++){
- if (mTypeMask & TOP_MASK){
- for(int i=5;i>=0;i--)mIndices.push_back(vtop+(gy*(grid_size+1))+gx+idxs[i]);
- }else{
- for(int i=0;i<6;i++)mIndices.push_back(vtop+(gy*(grid_size+1))+gx+idxs[i]);
+ mTriStrip.clear();
+ S32 idxs[] = {0,1,(grid_size+1)+1,(grid_size+1)+1,(grid_size+1),0};
+ for(S32 gx = 0;gx<grid_size;gx++)
+ {
+
+ for(S32 gy = 0;gy<grid_size;gy++)
+ {
+ if (mTypeMask & TOP_MASK)
+ {
+ for(S32 i=5;i>=0;i--)
+ {
+ mIndices.push_back(vtop+(gy*(grid_size+1))+gx+idxs[i]);
+ }
+
+ if (gy == 0)
+ {
+ mTriStrip.push_back((gx+1)*(grid_size+1));
+ mTriStrip.push_back((gx+1)*(grid_size+1));
+ mTriStrip.push_back(gx*(grid_size+1));
+ }
+
+ mTriStrip.push_back(gy+1+(gx+1)*(grid_size+1));
+ mTriStrip.push_back(gy+1+gx*(grid_size+1));
+
+
+ if (gy == grid_size-1)
+ {
+ mTriStrip.push_back(gy+1+gx*(grid_size+1));
+ }
+ }
+ else
+ {
+ for(S32 i=0;i<6;i++)
+ {
+ mIndices.push_back(vtop+(gy*(grid_size+1))+gx+idxs[i]);
+ }
+
+ if (gy == 0)
+ {
+ mTriStrip.push_back(gx*(grid_size+1));
+ mTriStrip.push_back(gx*(grid_size+1));
+ mTriStrip.push_back((gx+1)*(grid_size+1));
+ }
+
+ mTriStrip.push_back(gy+1+gx*(grid_size+1));
+ mTriStrip.push_back(gy+1+(gx+1)*(grid_size+1));
+
+ if (gy == grid_size-1)
+ {
+ mTriStrip.push_back(gy+1+(gx+1)*(grid_size+1));
+ }
}
}
+
+ }
+
+ if (mTriStrip.size()%2 == 1)
+ {
+ mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]);
}
}
@@ -4770,6 +5362,8 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
pt2--;
}
}
+
+ makeTriStrip();
}
else
{
@@ -4874,67 +5468,108 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
pt2--;
}
}
+
+ makeTriStrip();
}
}
else
{
// Not hollow, generate the triangle fan.
+ U16 v1 = 2;
+ U16 v2 = 1;
+
if (mTypeMask & TOP_MASK)
{
- if (mTypeMask & OPEN_MASK)
- {
- // SOLID OPEN TOP
- // Generate indices
- // This is a tri-fan, so we reuse the same first point for all triangles.
- for (S32 i = 0; i < (num_vertices - 2); i++)
- {
- mIndices[3*i] = num_vertices - 1;
- mIndices[3*i+1] = i;
- mIndices[3*i+2] = i + 1;
- }
- }
- else
- {
- // SOLID CLOSED TOP
- for (S32 i = 0; i < (num_vertices - 2); i++)
- {
- //MSMSM fix these caps but only for the un-cut case
- mIndices[3*i] = num_vertices - 1;
- mIndices[3*i+1] = i;
- mIndices[3*i+2] = i + 1;
- }
- }
+ v1 = 1;
+ v2 = 2;
+ }
+
+ for (S32 i = 0; i < (num_vertices - 2); i++)
+ {
+ mIndices[3*i] = num_vertices - 1;
+ mIndices[3*i+v1] = i;
+ mIndices[3*i+v2] = i + 1;
+ }
+
+ //make tri strip
+ if (mTypeMask & OPEN_MASK)
+ {
+ makeTriStrip();
}
else
{
- if (mTypeMask & OPEN_MASK)
+ S32 j = num_vertices-2;
+ if (mTypeMask & TOP_MASK)
{
- // SOLID OPEN BOTTOM
- // Generate indices
- // This is a tri-fan, so we reuse the same first point for all triangles.
- for (S32 i = 0; i < (num_vertices - 2); i++)
+ mTriStrip.push_back(0);
+ for (S32 i = 0; i <= j; ++i)
{
- mIndices[3*i] = num_vertices - 1;
- mIndices[3*i+1] = i + 1;
- mIndices[3*i+2] = i;
+ mTriStrip.push_back(i);
+ if (i != j)
+ {
+ mTriStrip.push_back(j);
+ }
+ --j;
}
}
else
{
- // SOLID CLOSED BOTTOM
- for (S32 i = 0; i < (num_vertices - 2); i++)
+ mTriStrip.push_back(j);
+ for (S32 i = 0; i <= j; ++i)
{
- //MSMSM fix these caps but only for the un-cut case
- mIndices[3*i] = num_vertices - 1;
- mIndices[3*i+1] = i + 1;
- mIndices[3*i+2] = i;
+ if (i != j)
+ {
+ mTriStrip.push_back(j);
+ }
+ mTriStrip.push_back(i);
+ --j;
}
}
+
+ mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]);
+
+ if (mTriStrip.size()%2 == 1)
+ {
+ mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]);
+ }
}
}
+
return TRUE;
}
+void LLVolumeFace::makeTriStrip()
+{
+ for (U32 i = 0; i < mIndices.size(); i+=3)
+ {
+ U16 i0 = mIndices[i];
+ U16 i1 = mIndices[i+1];
+ U16 i2 = mIndices[i+2];
+
+ if ((i/3)%2 == 1)
+ {
+ mTriStrip.push_back(i0);
+ mTriStrip.push_back(i0);
+ mTriStrip.push_back(i1);
+ mTriStrip.push_back(i2);
+ mTriStrip.push_back(i2);
+ }
+ else
+ {
+ mTriStrip.push_back(i2);
+ mTriStrip.push_back(i2);
+ mTriStrip.push_back(i1);
+ mTriStrip.push_back(i0);
+ mTriStrip.push_back(i0);
+ }
+ }
+
+ if (mTriStrip.size()%2 == 1)
+ {
+ mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]);
+ }
+}
+
void LLVolumeFace::createBinormals()
{
LLMemType m1(LLMemType::MTYPE_VOLUME);
@@ -5011,7 +5646,11 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
if (!partial_build)
{
mIndices.resize(num_indices);
- mEdge.resize(num_indices);
+
+ if ((volume->getParams().getSculptType() & LL_SCULPT_TYPE_MASK) != LL_SCULPT_TYPE_MESH)
+ {
+ mEdge.resize(num_indices);
+ }
}
else
{
@@ -5135,9 +5774,14 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
if (!partial_build)
{
+ mTriStrip.clear();
+
// Now we generate the indices.
for (t = 0; t < (mNumT-1); t++)
{
+ //prepend terminating index to strip
+ mTriStrip.push_back(mNumS*t);
+
for (s = 0; s < (mNumS-1); s++)
{
mIndices[cur_index++] = s + mNumS*t; //bottom left
@@ -5147,6 +5791,14 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
mIndices[cur_index++] = s+1 + mNumS*t; //bottom right
mIndices[cur_index++] = s+1 + mNumS*(t+1); //top right
+ if (s == 0)
+ {
+ mTriStrip.push_back(s+mNumS*t);
+ mTriStrip.push_back(s+mNumS*(t+1));
+ }
+ mTriStrip.push_back(s+1+mNumS*t);
+ mTriStrip.push_back(s+1+mNumS*(t+1));
+
mEdge[cur_edge++] = (mNumS-1)*2*t+s*2+1; //bottom left/top right neighbor face
if (t < mNumT-2) { //top right/top left neighbor face
mEdge[cur_edge++] = (mNumS-1)*2*(t+1)+s*2+1;
@@ -5187,6 +5839,13 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
}
mEdge[cur_edge++] = (mNumS-1)*2*t+s*2; //top right/bottom left neighbor face
}
+ //append terminating vertex to strip
+ mTriStrip.push_back(mNumS-1+mNumS*(t+1));
+ }
+
+ if (mTriStrip.size()%2 == 1)
+ {
+ mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]);
}
}
diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h
index 871b334452..b871dad22a 100644
--- a/indra/llmath/llvolume.h
+++ b/indra/llmath/llvolume.h
@@ -183,12 +183,15 @@ const U8 LL_SCULPT_TYPE_SPHERE = 1;
const U8 LL_SCULPT_TYPE_TORUS = 2;
const U8 LL_SCULPT_TYPE_PLANE = 3;
const U8 LL_SCULPT_TYPE_CYLINDER = 4;
+const U8 LL_SCULPT_TYPE_MESH = 5;
-const U8 LL_SCULPT_TYPE_MASK = LL_SCULPT_TYPE_SPHERE | LL_SCULPT_TYPE_TORUS | LL_SCULPT_TYPE_PLANE | LL_SCULPT_TYPE_CYLINDER;
+const U8 LL_SCULPT_TYPE_MASK = LL_SCULPT_TYPE_SPHERE | LL_SCULPT_TYPE_TORUS | LL_SCULPT_TYPE_PLANE |
+ LL_SCULPT_TYPE_CYLINDER | LL_SCULPT_TYPE_MESH;
const U8 LL_SCULPT_FLAG_INVERT = 64;
const U8 LL_SCULPT_FLAG_MIRROR = 128;
+const S32 LL_SCULPT_MESH_MAX_FACES = 8;
class LLProfileParams
{
@@ -575,6 +578,9 @@ public:
BOOL importLegacyStream(std::istream& input_stream);
BOOL exportLegacyStream(std::ostream& output_stream) const;
+ LLSD sculptAsLLSD() const;
+ bool sculptFromLLSD(LLSD& sd);
+
LLSD asLLSD() const;
operator LLSD() const { return asLLSD(); }
bool fromLLSD(LLSD& sd);
@@ -634,7 +640,6 @@ public:
const F32& getSkew() const { return mPathParams.getSkew(); }
const LLUUID& getSculptID() const { return mSculptID; }
const U8& getSculptType() const { return mSculptType; }
-
BOOL isConvex() const;
// 'begin' and 'end' should be in range [0, 1] (they will be clamped)
@@ -798,7 +803,8 @@ public:
BOOL create(LLVolume* volume, BOOL partial_build = FALSE);
void createBinormals();
-
+ void makeTriStrip();
+
class VertexData
{
public:
@@ -806,6 +812,10 @@ public:
LLVector3 mNormal;
LLVector3 mBinormal;
LLVector2 mTexCoord;
+
+ bool operator<(const VertexData& rhs) const;
+ bool operator==(const VertexData& rhs) const;
+ bool compareNormal(const VertexData& rhs, F32 angle_cutoff) const;
};
enum
@@ -839,6 +849,7 @@ public:
std::vector<VertexData> mVertices;
std::vector<U16> mIndices;
+ std::vector<U16> mTriStrip;
std::vector<S32> mEdge;
private:
@@ -851,8 +862,7 @@ class LLVolume : public LLRefCount
{
friend class LLVolumeLODGroup;
-private:
- LLVolume(const LLVolume&); // Don't implement
+protected:
~LLVolume(); // use unref
public:
@@ -874,7 +884,7 @@ public:
U8 getProfileType() const { return mParams.getProfileParams().getCurveType(); }
U8 getPathType() const { return mParams.getPathParams().getCurveType(); }
- S32 getNumFaces() const { return (S32)mProfilep->mFaces.size(); }
+ S32 getNumFaces() const;
S32 getNumVolumeFaces() const { return mVolumeFaces.size(); }
F32 getDetail() const { return mDetail; }
const LLVolumeParams& getParams() const { return mParams; }
@@ -896,12 +906,15 @@ public:
BOOL isUnique() const { return mUnique; }
S32 getSculptLevel() const { return mSculptLevel; }
-
+ void setSculptLevel(S32 level) { mSculptLevel = level; }
+
S32 *getTriangleIndices(U32 &num_indices) const;
// returns number of triangle indeces required for path/profile mesh
S32 getNumTriangleIndices() const;
+ S32 getNumTriangles() const;
+
void generateSilhouetteVertices(std::vector<LLVector3> &vertices,
std::vector<LLVector3> &normals,
std::vector<S32> &segments,
@@ -946,6 +959,8 @@ public:
LLVector3 mLODScaleBias; // vector for biasing LOD based on scale
void sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, S32 sculpt_level);
+ void copyVolumeFaces(LLVolume* volume);
+
private:
void sculptGenerateMapVertices(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, U8 sculpt_type);
F32 sculptGetSurfaceArea();
@@ -956,11 +971,19 @@ private:
protected:
BOOL generate();
void createVolumeFaces();
+public:
+ virtual BOOL createVolumeFacesFromFile(const std::string& file_name);
+ virtual BOOL createVolumeFacesFromStream(std::istream& is);
+ virtual BOOL unpackVolumeFaces(std::istream& is, S32 size);
+
+ virtual void makeTetrahedron();
+ virtual BOOL isTetrahedron();
protected:
BOOL mUnique;
F32 mDetail;
S32 mSculptLevel;
+ BOOL mIsTetrahedron;
LLVolumeParams mParams;
LLPath *mPathp;
diff --git a/indra/llmath/llvolumemgr.cpp b/indra/llmath/llvolumemgr.cpp
index 53641fceab..419e0015ba 100644
--- a/indra/llmath/llvolumemgr.cpp
+++ b/indra/llmath/llvolumemgr.cpp
@@ -320,7 +320,7 @@ BOOL LLVolumeLODGroup::derefLOD(LLVolume *volumep)
{
llassert_always(mLODRefs[i] > 0);
mLODRefs[i]--;
-#if 1 // SJB: Possible opt: keep other lods around
+#if 0 // SJB: Possible opt: keep other lods around
if (!mLODRefs[i])
{
mVolumeLODs[i] = NULL;
@@ -375,6 +375,19 @@ F32 LLVolumeLODGroup::getVolumeScaleFromDetail(const S32 detail)
return mDetailScales[detail];
}
+S32 LLVolumeLODGroup::getVolumeDetailFromScale(const F32 detail)
+{
+ for (S32 i = 1; i < 4; i++)
+ {
+ if (mDetailScales[i] > detail)
+ {
+ return i-1;
+ }
+ }
+
+ return 3;
+}
+
F32 LLVolumeLODGroup::dump()
{
F32 usage = 0.f;
diff --git a/indra/llmath/llvolumemgr.h b/indra/llmath/llvolumemgr.h
index a78ea76a1a..f5dc4cd748 100644
--- a/indra/llmath/llvolumemgr.h
+++ b/indra/llmath/llvolumemgr.h
@@ -59,6 +59,7 @@ public:
static S32 getDetailFromTan(const F32 tan_angle);
static void getDetailProximity(const F32 tan_angle, F32 &to_lower, F32& to_higher);
static F32 getVolumeScaleFromDetail(const S32 detail);
+ static S32 getVolumeDetailFromScale(F32 scale);
LLVolume* refLOD(const S32 detail);
BOOL derefLOD(LLVolume *volumep);
diff --git a/indra/llmath/m4math.cpp b/indra/llmath/m4math.cpp
index d8e7b4aaf9..5c112b52b2 100644
--- a/indra/llmath/m4math.cpp
+++ b/indra/llmath/m4math.cpp
@@ -221,8 +221,33 @@ const LLMatrix4& LLMatrix4::transpose()
F32 LLMatrix4::determinant() const
{
- llerrs << "Not implemented!" << llendl;
- return 0.f;
+ F32 value =
+ mMatrix[0][3] * mMatrix[1][2] * mMatrix[2][1] * mMatrix[3][0] -
+ mMatrix[0][2] * mMatrix[1][3] * mMatrix[2][1] * mMatrix[3][0] -
+ mMatrix[0][3] * mMatrix[1][1] * mMatrix[2][2] * mMatrix[3][0] +
+ mMatrix[0][1] * mMatrix[1][3] * mMatrix[2][2] * mMatrix[3][0] +
+ mMatrix[0][2] * mMatrix[1][1] * mMatrix[2][3] * mMatrix[3][0] -
+ mMatrix[0][1] * mMatrix[1][2] * mMatrix[2][3] * mMatrix[3][0] -
+ mMatrix[0][3] * mMatrix[1][2] * mMatrix[2][0] * mMatrix[3][1] +
+ mMatrix[0][2] * mMatrix[1][3] * mMatrix[2][0] * mMatrix[3][1] +
+ mMatrix[0][3] * mMatrix[1][0] * mMatrix[2][2] * mMatrix[3][1] -
+ mMatrix[0][0] * mMatrix[1][3] * mMatrix[2][2] * mMatrix[3][1] -
+ mMatrix[0][2] * mMatrix[1][0] * mMatrix[2][3] * mMatrix[3][1] +
+ mMatrix[0][0] * mMatrix[1][2] * mMatrix[2][3] * mMatrix[3][1] +
+ mMatrix[0][3] * mMatrix[1][1] * mMatrix[2][0] * mMatrix[3][2] -
+ mMatrix[0][1] * mMatrix[1][3] * mMatrix[2][0] * mMatrix[3][2] -
+ mMatrix[0][3] * mMatrix[1][0] * mMatrix[2][1] * mMatrix[3][2] +
+ mMatrix[0][0] * mMatrix[1][3] * mMatrix[2][1] * mMatrix[3][2] +
+ mMatrix[0][1] * mMatrix[1][0] * mMatrix[2][3] * mMatrix[3][2] -
+ mMatrix[0][0] * mMatrix[1][1] * mMatrix[2][3] * mMatrix[3][2] -
+ mMatrix[0][2] * mMatrix[1][1] * mMatrix[2][0] * mMatrix[3][3] +
+ mMatrix[0][1] * mMatrix[1][2] * mMatrix[2][0] * mMatrix[3][3] +
+ mMatrix[0][2] * mMatrix[1][0] * mMatrix[2][1] * mMatrix[3][3] -
+ mMatrix[0][0] * mMatrix[1][2] * mMatrix[2][1] * mMatrix[3][3] -
+ mMatrix[0][1] * mMatrix[1][0] * mMatrix[2][2] * mMatrix[3][3] +
+ mMatrix[0][0] * mMatrix[1][1] * mMatrix[2][2] * mMatrix[3][3];
+
+ return value;
}
// Only works for pure orthonormal, homogeneous transform matrices.
@@ -428,6 +453,17 @@ const LLMatrix4& LLMatrix4::initRotTrans(const LLQuaternion &q, const LLVector
return (*this);
}
+const LLMatrix4& LLMatrix4::initScale(const LLVector3 &scale)
+{
+ setIdentity();
+
+ mMatrix[VX][VX] = scale.mV[VX];
+ mMatrix[VY][VY] = scale.mV[VY];
+ mMatrix[VZ][VZ] = scale.mV[VZ];
+
+ return (*this);
+}
+
const LLMatrix4& LLMatrix4::initAll(const LLVector3 &scale, const LLQuaternion &q, const LLVector3 &pos)
{
F32 sx, sy, sz;
@@ -774,6 +810,23 @@ bool operator!=(const LLMatrix4 &a, const LLMatrix4 &b)
return FALSE;
}
+bool operator<(const LLMatrix4& a, const LLMatrix4 &b)
+{
+ U32 i, j;
+ for (i = 0; i < NUM_VALUES_IN_MAT4; i++)
+ {
+ for (j = 0; j < NUM_VALUES_IN_MAT4; j++)
+ {
+ if (a.mMatrix[i][j] != b.mMatrix[i][j])
+ {
+ return a.mMatrix[i][j] < b.mMatrix[i][j];
+ }
+ }
+ }
+
+ return false;
+}
+
const LLMatrix4& operator*=(LLMatrix4 &a, F32 k)
{
U32 i, j;
diff --git a/indra/llmath/m4math.h b/indra/llmath/m4math.h
index e74b7afe9b..6007b96bd9 100644
--- a/indra/llmath/m4math.h
+++ b/indra/llmath/m4math.h
@@ -159,6 +159,7 @@ public:
const LLMatrix4& initRotTrans(const F32 roll, const F32 pitch, const F32 yaw, const LLVector4 &pos); // Rotation from Euler + translation
const LLMatrix4& initRotTrans(const LLQuaternion &q, const LLVector4 &pos); // Set with Quaternion and position
+ const LLMatrix4& initScale(const LLVector3 &scale);
// Set all
const LLMatrix4& initAll(const LLVector3 &scale, const LLQuaternion &q, const LLVector3 &pos);
@@ -236,6 +237,7 @@ public:
friend bool operator==(const LLMatrix4 &a, const LLMatrix4 &b); // Return a == b
friend bool operator!=(const LLMatrix4 &a, const LLMatrix4 &b); // Return a != b
+ friend bool operator<(const LLMatrix4 &a, const LLMatrix4& b); // Return a < b
friend const LLMatrix4& operator+=(LLMatrix4 &a, const LLMatrix4 &b); // Return a + b
friend const LLMatrix4& operator-=(LLMatrix4 &a, const LLMatrix4 &b); // Return a - b
diff --git a/indra/llmath/v2math.cpp b/indra/llmath/v2math.cpp
index 555e1f92bb..220336e0c2 100644
--- a/indra/llmath/v2math.cpp
+++ b/indra/llmath/v2math.cpp
@@ -115,3 +115,18 @@ LLVector2 lerp(const LLVector2 &a, const LLVector2 &b, F32 u)
a.mV[VX] + (b.mV[VX] - a.mV[VX]) * u,
a.mV[VY] + (b.mV[VY] - a.mV[VY]) * u );
}
+
+LLSD LLVector2::getValue() const
+{
+ LLSD ret;
+ ret[0] = mV[0];
+ ret[1] = mV[1];
+ return ret;
+}
+
+void LLVector2::setValue(LLSD& sd)
+{
+ mV[0] = (F32) sd[0].asReal();
+ mV[1] = (F32) sd[1].asReal();
+}
+
diff --git a/indra/llmath/v2math.h b/indra/llmath/v2math.h
index 9fef8851cc..f9f1c024f2 100644
--- a/indra/llmath/v2math.h
+++ b/indra/llmath/v2math.h
@@ -66,6 +66,9 @@ class LLVector2
void set(const LLVector2 &vec); // Sets LLVector2 to vec
void set(const F32 *vec); // Sets LLVector2 to vec
+ LLSD getValue() const;
+ void setValue(LLSD& sd);
+
void setVec(F32 x, F32 y); // deprecated
void setVec(const LLVector2 &vec); // deprecated
void setVec(const F32 *vec); // deprecated
diff --git a/indra/llmessage/llassetstorage.cpp b/indra/llmessage/llassetstorage.cpp
index 0ab1081200..047b99c861 100644
--- a/indra/llmessage/llassetstorage.cpp
+++ b/indra/llmessage/llassetstorage.cpp
@@ -505,7 +505,7 @@ void LLAssetStorage::_queueDataRequest(const LLUUID& uuid, LLAssetType::EType at
tpvf.setAsset(uuid, atype);
tpvf.setCallback(downloadCompleteCallback, req);
- llinfos << "Starting transfer for " << uuid << llendl;
+ //llinfos << "Starting transfer for " << uuid << llendl;
LLTransferTargetChannel *ttcp = gTransferManager.getTargetChannel(mUpstreamHost, LLTCT_ASSET);
ttcp->requestTransfer(spa, tpvf, 100.f + (is_priority ? 1.f : 0.f));
}
diff --git a/indra/llmessage/llpumpio.cpp b/indra/llmessage/llpumpio.cpp
index 5e9dfd81fa..e3ce2c5ad3 100644
--- a/indra/llmessage/llpumpio.cpp
+++ b/indra/llmessage/llpumpio.cpp
@@ -444,13 +444,13 @@ void LLPumpIO::pump()
pump(DEFAULT_POLL_TIMEOUT);
}
-static LLFastTimer::DeclareTimer FTM_PUMP("Pump");
+static LLFastTimer::DeclareTimer FTM_PUMP_IO("Pump IO");
//timeout is in microseconds
void LLPumpIO::pump(const S32& poll_timeout)
{
LLMemType m1(LLMemType::MTYPE_IO_PUMP);
- LLFastTimer t1(FTM_PUMP);
+ LLFastTimer t1(FTM_PUMP_IO);
//llinfos << "LLPumpIO::pump()" << llendl;
// Run any pending runners.
@@ -778,6 +778,8 @@ bool LLPumpIO::respond(
return true;
}
+static LLFastTimer::DeclareTimer FTM_PUMP_CALLBACK_CHAIN("Chain");
+
void LLPumpIO::callback()
{
LLMemType m1(LLMemType::MTYPE_IO_PUMP);
@@ -799,6 +801,7 @@ void LLPumpIO::callback()
callbacks_t::iterator end = mCallbacks.end();
for(; it != end; ++it)
{
+ LLFastTimer t(FTM_PUMP_CALLBACK_CHAIN);
// it's always the first and last time for respone chains
(*it).mHead = (*it).mChainLinks.begin();
(*it).mInit = true;
diff --git a/indra/llmessage/lltransfermanager.cpp b/indra/llmessage/lltransfermanager.cpp
index d64b666ede..de9c609500 100644
--- a/indra/llmessage/lltransfermanager.cpp
+++ b/indra/llmessage/lltransfermanager.cpp
@@ -344,7 +344,7 @@ void LLTransferManager::processTransferInfo(LLMessageSystem *msgp, void **)
}
}
- llinfos << "Receiving " << transfer_id << ", size " << size << " bytes" << llendl;
+ //llinfos << "Receiving " << transfer_id << ", size " << size << " bytes" << llendl;
ttp->setSize(size);
ttp->setGotInfo(TRUE);
diff --git a/indra/llmessage/lltransfersourceasset.cpp b/indra/llmessage/lltransfersourceasset.cpp
index 8f36d516d7..7a27f01ea3 100644
--- a/indra/llmessage/lltransfersourceasset.cpp
+++ b/indra/llmessage/lltransfersourceasset.cpp
@@ -273,6 +273,7 @@ bool is_asset_fetch_by_id_allowed(LLAssetType::EType type)
case LLAssetType::AT_BODYPART:
case LLAssetType::AT_ANIMATION:
case LLAssetType::AT_GESTURE:
+ case LLAssetType::AT_MESH:
rv = true;
break;
default:
@@ -297,6 +298,7 @@ bool is_asset_id_knowable(LLAssetType::EType type)
case LLAssetType::AT_GESTURE:
case LLAssetType::AT_LINK:
case LLAssetType::AT_LINK_FOLDER:
+ case LLAssetType::AT_MESH:
rv = true;
break;
default:
diff --git a/indra/llmessage/tests/llareslistener_test.cpp b/indra/llmessage/tests/llareslistener_test.cpp
index ac4886ccf4..6ee74c8e7a 100644
--- a/indra/llmessage/tests/llareslistener_test.cpp
+++ b/indra/llmessage/tests/llareslistener_test.cpp
@@ -4,7 +4,7 @@
* @date 2009-02-26
* @brief Tests of llareslistener.h.
*
- * $LicenseInfo:firstyear=2009&license=internal$
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
* Copyright (c) 2009, Linden Research, Inc.
* $/LicenseInfo$
*/
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index 91c796a9e6..6a2449cf4b 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -471,7 +471,7 @@ void LLPluginClassMedia::mouseEvent(EMouseEventType type, int button, int x, int
sendMessage(message);
}
-bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifiers)
+bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data)
{
bool result = true;
@@ -528,6 +528,7 @@ bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifie
message.setValueS32("key", key_code);
message.setValue("modifiers", translateModifiers(modifiers));
+ message.setValueLLSD("native_key_data", native_key_data);
sendMessage(message);
}
@@ -546,12 +547,13 @@ void LLPluginClassMedia::scrollEvent(int x, int y, MASK modifiers)
sendMessage(message);
}
-bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers)
+bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers, LLSD native_key_data)
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "text_event");
message.setValue("text", text);
message.setValue("modifiers", translateModifiers(modifiers));
+ message.setValueLLSD("native_key_data", native_key_data);
sendMessage(message);
@@ -682,13 +684,13 @@ LLPluginClassMedia::ETargetType getTargetTypeFromLLQtWebkit(int target_type)
// so that we don't expose the llqtwebkit header in viewer code
switch (target_type)
{
- case LinkTargetType::LTT_TARGET_NONE:
+ case LLQtWebKit::LTT_TARGET_NONE:
return LLPluginClassMedia::TARGET_NONE;
- case LinkTargetType::LTT_TARGET_BLANK:
+ case LLQtWebKit::LTT_TARGET_BLANK:
return LLPluginClassMedia::TARGET_BLANK;
- case LinkTargetType::LTT_TARGET_EXTERNAL:
+ case LLQtWebKit::LTT_TARGET_EXTERNAL:
return LLPluginClassMedia::TARGET_EXTERNAL;
default:
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index ebb9099576..58e91fa0b4 100644
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -114,12 +114,12 @@ public:
KEY_EVENT_REPEAT
}EKeyEventType;
- bool keyEvent(EKeyEventType type, int key_code, MASK modifiers);
+ bool keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data);
void scrollEvent(int x, int y, MASK modifiers);
// Text may be unicode (utf8 encoded)
- bool textInput(const std::string &text, MASK modifiers);
+ bool textInput(const std::string &text, MASK modifiers, LLSD native_key_data);
void loadURI(const std::string &uri);
diff --git a/indra/llplugin/llpluginmessagepipe.cpp b/indra/llplugin/llpluginmessagepipe.cpp
index cc193fca42..1d7ddc5592 100644
--- a/indra/llplugin/llpluginmessagepipe.cpp
+++ b/indra/llplugin/llpluginmessagepipe.cpp
@@ -304,7 +304,14 @@ void LLPluginMessagePipe::processInput(void)
while((delim = mInput.find(MESSAGE_DELIMITER, start)) != std::string::npos)
{
// Let the owner process this message
- mOwner->receiveMessageRaw(mInput.substr(start, delim - start));
+ if (mOwner)
+ {
+ mOwner->receiveMessageRaw(mInput.substr(start, delim - start));
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "!mOwner" << LL_ENDL;
+ }
start = delim + 1;
}
diff --git a/indra/llplugin/llpluginprocesschild.cpp b/indra/llplugin/llpluginprocesschild.cpp
index 0f3254d78d..52b5a319ec 100644
--- a/indra/llplugin/llpluginprocesschild.cpp
+++ b/indra/llplugin/llpluginprocesschild.cpp
@@ -278,14 +278,21 @@ bool LLPluginProcessChild::isDone(void)
void LLPluginProcessChild::sendMessageToPlugin(const LLPluginMessage &message)
{
- std::string buffer = message.generate();
-
- LL_DEBUGS("Plugin") << "Sending to plugin: " << buffer << LL_ENDL;
- LLTimer elapsed;
-
- mInstance->sendMessage(buffer);
-
- mCPUElapsed += elapsed.getElapsedTimeF64();
+ if (mInstance)
+ {
+ std::string buffer = message.generate();
+
+ LL_DEBUGS("Plugin") << "Sending to plugin: " << buffer << LL_ENDL;
+ LLTimer elapsed;
+
+ mInstance->sendMessage(buffer);
+
+ mCPUElapsed += elapsed.getElapsedTimeF64();
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "mInstance == NULL" << LL_ENDL;
+ }
}
void LLPluginProcessChild::sendMessageToParent(const LLPluginMessage &message)
diff --git a/indra/llprimitive/CMakeLists.txt b/indra/llprimitive/CMakeLists.txt
index 68a3d54597..af78ed7936 100644
--- a/indra/llprimitive/CMakeLists.txt
+++ b/indra/llprimitive/CMakeLists.txt
@@ -13,11 +13,14 @@ include_directories(
${LLMATH_INCLUDE_DIRS}
${LLMESSAGE_INCLUDE_DIRS}
${LLXML_INCLUDE_DIRS}
+ ${LIBS_PREBUILT_DIR}/include/collada
+ ${LIBS_PREBUILT_DIR}/include/collada/1.4
)
set(llprimitive_SOURCE_FILES
llmaterialtable.cpp
llmediaentry.cpp
+ llmodel.cpp
llprimitive.cpp
llprimtexturelist.cpp
lltextureanim.cpp
@@ -34,6 +37,7 @@ set(llprimitive_HEADER_FILES
legacy_object_types.h
llmaterialtable.h
llmediaentry.h
+ llmodel.h
llprimitive.h
llprimtexturelist.h
lltextureanim.h
diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp
index b75d1b0f67..732f5a698b 100644
--- a/indra/llprimitive/llprimitive.cpp
+++ b/indra/llprimitive/llprimitive.cpp
@@ -744,7 +744,11 @@ BOOL LLPrimitive::setVolume(const LLVolumeParams &volume_params, const S32 detai
setNumTEs(mVolumep->getNumFaces());
return TRUE;
}
-
+
+#if 0
+ // #if 0'd out by davep
+ // this is a lot of cruft to set texture entry values that just stay the same for LOD switch
+ // or immediately get overridden by an object update message, also crashes occasionally
U32 old_face_mask = mVolumep->mFaceMask;
S32 face_bit = 0;
@@ -942,6 +946,13 @@ BOOL LLPrimitive::setVolume(const LLVolumeParams &volume_params, const S32 detai
setTE(te_num, *(old_tes.getTexture(face_mapping[face_bit])));
}
}
+#else
+ // build the new object
+ sVolumeManager->unrefVolume(mVolumep);
+ mVolumep = volumep;
+
+ setNumTEs(mVolumep->getNumFaces());
+#endif
return TRUE;
}
@@ -1084,7 +1095,7 @@ BOOL LLPrimitive::packTEMessage(LLMessageSystem *mesgsys) const
U8 packed_buffer[MAX_TE_BUFFER];
U8 *cur_ptr = packed_buffer;
- S32 last_face_index = getNumTEs() - 1;
+ S32 last_face_index = llmin((U32) getNumTEs(), MAX_TES) - 1;
if (last_face_index > -1)
{
@@ -1365,7 +1376,7 @@ S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp)
return retval;
}
- face_count = getNumTEs();
+ face_count = llmin((U32) getNumTEs(), MAX_TES);
U32 i;
cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)image_data, 16, face_count, MVT_LLUUID);
diff --git a/indra/llprimitive/llprimitive.h b/indra/llprimitive/llprimitive.h
index 4f828186cb..a44b9a6c1f 100644
--- a/indra/llprimitive/llprimitive.h
+++ b/indra/llprimitive/llprimitive.h
@@ -286,6 +286,7 @@ public:
void setLightTexture(const LLUUID& id) { mLightTexture = id; }
LLUUID getLightTexture() const { return mLightTexture; }
+ bool isLightSpotlight() const { return mLightTexture.notNull(); }
void setParams(const LLVector3& params) { mParams = params; }
LLVector3 getParams() const { return mParams; }
@@ -328,7 +329,7 @@ public:
const LLVolume *getVolumeConst() const { return mVolumep; } // HACK for Windoze confusion about ostream operator in LLVolume
LLVolume *getVolume() const { return mVolumep; }
virtual BOOL setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume = false);
-
+
// Modify texture entry properties
inline BOOL validTE(const U8 te_num) const;
LLTextureEntry* getTE(const U8 te_num) const;
diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp
index 59e7d890f4..22fad792da 100644
--- a/indra/llrender/llfontfreetype.cpp
+++ b/indra/llrender/llfontfreetype.cpp
@@ -504,8 +504,13 @@ void LLFontFreetype::resetBitmapCache()
mCharGlyphInfoMap.clear();
mFontBitmapCachep->reset();
- // Add the empty glyph
- addGlyphFromFont(this, 0, 0);
+ // Adding default glyph is skipped for fallback fonts here as well as in loadFace().
+ // This if was added as fix for EXT-4971.
+ if(!mIsFallback)
+ {
+ // Add the empty glyph
+ addGlyphFromFont(this, 0, 0);
+ }
}
void LLFontFreetype::destroyGL()
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index d2dc1104a8..fb153a6e3b 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -931,25 +931,25 @@ void LLRender::setSceneBlendType(eBlendType type)
switch (type)
{
case BT_ALPHA:
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ blendFunc(BF_SOURCE_ALPHA, BF_ONE_MINUS_SOURCE_ALPHA);
break;
case BT_ADD:
- glBlendFunc(GL_ONE, GL_ONE);
+ blendFunc(BF_ONE, BF_ONE);
break;
case BT_ADD_WITH_ALPHA:
- glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ blendFunc(BF_SOURCE_ALPHA, BF_ONE);
break;
case BT_MULT:
- glBlendFunc(GL_DST_COLOR, GL_ZERO);
+ blendFunc(BF_DEST_COLOR, BF_ZERO);
break;
case BT_MULT_ALPHA:
- glBlendFunc(GL_DST_ALPHA, GL_ZERO);
+ blendFunc(BF_DEST_ALPHA, BF_ZERO);
break;
case BT_MULT_X2:
- glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR);
+ blendFunc(BF_DEST_COLOR, BF_SOURCE_COLOR);
break;
case BT_REPLACE:
- glBlendFunc(GL_ONE, GL_ZERO);
+ blendFunc(BF_ONE, BF_ZERO);
break;
default:
llerrs << "Unknown Scene Blend Type: " << type << llendl;
@@ -976,8 +976,13 @@ void LLRender::setAlphaRejectSettings(eCompareFunc func, F32 value)
void LLRender::blendFunc(eBlendFactor sfactor, eBlendFactor dfactor)
{
- flush();
- glBlendFunc(sGLBlendFactor[sfactor], sGLBlendFactor[dfactor]);
+ if (mCurrBlendSFactor != sfactor || mCurrBlendDFactor != dfactor)
+ {
+ mCurrBlendSFactor = sfactor;
+ mCurrBlendDFactor = dfactor;
+ flush();
+ glBlendFunc(sGLBlendFactor[sfactor], sGLBlendFactor[dfactor]);
+ }
}
LLTexUnit* LLRender::getTexUnit(U32 index)
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index d9520b3bf6..3f2558f1f5 100644
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -390,8 +390,6 @@ void LLRenderTarget::flush(BOOL fetch_depth)
}
else
{
-#if !LL_DARWIN
-
stop_glerror();
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
@@ -435,7 +433,6 @@ void LLRenderTarget::flush(BOOL fetch_depth)
}
}
}
-#endif
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}
@@ -444,7 +441,6 @@ void LLRenderTarget::flush(BOOL fetch_depth)
void LLRenderTarget::copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0, S32 srcX1, S32 srcY1,
S32 dstX0, S32 dstY0, S32 dstX1, S32 dstY1, U32 mask, U32 filter)
{
-#if !LL_DARWIN
gGL.flush();
if (!source.mFBO || !mFBO)
{
@@ -483,14 +479,12 @@ void LLRenderTarget::copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0,
stop_glerror();
}
}
-#endif
}
//static
void LLRenderTarget::copyContentsToFramebuffer(LLRenderTarget& source, S32 srcX0, S32 srcY0, S32 srcX1, S32 srcY1,
S32 dstX0, S32 dstY0, S32 dstX1, S32 dstY1, U32 mask, U32 filter)
{
-#if !LL_DARWIN
if (!source.mFBO)
{
llerrs << "Cannot copy framebuffer contents for non FBO render targets." << llendl;
@@ -507,7 +501,6 @@ void LLRenderTarget::copyContentsToFramebuffer(LLRenderTarget& source, S32 srcX0
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
stop_glerror();
}
-#endif
}
BOOL LLRenderTarget::isComplete() const
@@ -652,7 +645,6 @@ void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth
void LLMultisampleBuffer::addColorAttachment(U32 color_fmt)
{
-#if !LL_DARWIN
if (color_fmt == 0)
{
return;
@@ -693,12 +685,10 @@ void LLMultisampleBuffer::addColorAttachment(U32 color_fmt)
}
mTex.push_back(tex);
-#endif
}
void LLMultisampleBuffer::allocateDepth()
{
-#if !LL_DARWIN
glGenRenderbuffersEXT(1, (GLuint* ) &mDepth);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mDepth);
if (mStencil)
@@ -709,6 +699,5 @@ void LLMultisampleBuffer::allocateDepth()
{
glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, mSamples, GL_DEPTH_COMPONENT16_ARB, mResX, mResY);
}
-#endif
}
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index bf5eda21eb..116e265914 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -579,7 +579,7 @@ void LLVertexBuffer::destroyGLBuffer()
}
mGLBuffer = 0;
- unbind();
+ //unbind();
}
void LLVertexBuffer::destroyGLIndices()
@@ -606,7 +606,7 @@ void LLVertexBuffer::destroyGLIndices()
}
mGLIndices = 0;
- unbind();
+ //unbind();
}
void LLVertexBuffer::updateNumVerts(S32 nverts)
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index ce068618e2..853f6f173d 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -90,6 +90,7 @@ set(llui_SOURCE_FILES
lltextbox.cpp
lltexteditor.cpp
lltextparser.cpp
+ lltextvalidate.cpp
lltransutil.cpp
lltoggleablemenu.cpp
lltooltip.cpp
@@ -182,6 +183,7 @@ set(llui_HEADER_FILES
lltextbox.h
lltexteditor.h
lltextparser.h
+ lltextvalidate.h
lltoggleablemenu.h
lltooltip.h
lltransutil.h
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 4944ed4fe7..1d4dc35cee 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -81,10 +81,9 @@ LLButton::Params::Params()
image_pressed_selected("image_pressed_selected"),
image_overlay("image_overlay"),
image_overlay_alignment("image_overlay_alignment", std::string("center")),
- image_left_pad("image_left_pad"),
- image_right_pad("image_right_pad"),
image_top_pad("image_top_pad"),
image_bottom_pad("image_bottom_pad"),
+ imgoverlay_label_space("imgoverlay_label_space", 1),
label_color("label_color"),
label_color_selected("label_color_selected"), // requires is_toggle true
label_color_disabled("label_color_disabled"),
@@ -144,10 +143,9 @@ LLButton::LLButton(const LLButton::Params& p)
mImageOverlay(p.image_overlay()),
mImageOverlayColor(p.image_overlay_color()),
mImageOverlayAlignment(LLFontGL::hAlignFromName(p.image_overlay_alignment)),
- mImageOverlayLeftPad(p.image_left_pad),
- mImageOverlayRightPad(p.image_right_pad),
mImageOverlayTopPad(p.image_top_pad),
mImageOverlayBottomPad(p.image_bottom_pad),
+ mImgOverlayLabelSpace(p.imgoverlay_label_space),
mIsToggle(p.is_toggle),
mScaleImage(p.scale_image),
mDropShadowedText(p.label_shadow),
@@ -771,12 +769,7 @@ void LLButton::draw()
center_x++;
}
- S32 text_width_delta = overlay_width + 1;
- // if image paddings set, they should participate in scaling process
- S32 image_size_delta = mImageOverlayTopPad + mImageOverlayBottomPad;
- overlay_width = overlay_width - image_size_delta;
- overlay_height = overlay_height - image_size_delta;
-
+ center_y += (mImageOverlayBottomPad - mImageOverlayTopPad);
// fade out overlay images on disabled buttons
LLColor4 overlay_color = mImageOverlayColor.get();
if (!enabled)
@@ -788,10 +781,9 @@ void LLButton::draw()
switch(mImageOverlayAlignment)
{
case LLFontGL::LEFT:
- text_left += overlay_width + mImageOverlayRightPad + 1;
- text_width -= text_width_delta;
+ text_left += overlay_width + mImgOverlayLabelSpace;
mImageOverlay->draw(
- mLeftHPad,
+ mLeftHPad,
center_y - (overlay_height / 2),
overlay_width,
overlay_height,
@@ -806,10 +798,9 @@ void LLButton::draw()
overlay_color);
break;
case LLFontGL::RIGHT:
- text_right -= overlay_width + mImageOverlayLeftPad+ 1;
- text_width -= text_width_delta;
+ text_right -= overlay_width + mImgOverlayLabelSpace;
mImageOverlay->draw(
- getRect().getWidth() - mRightHPad - overlay_width,
+ getRect().getWidth() - mRightHPad - overlay_width,
center_y - (overlay_height / 2),
overlay_width,
overlay_height,
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 8e5f19602f..8f35db1007 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -107,11 +107,14 @@ public:
Optional<S32> pad_bottom; // under text label
//image overlay paddings
- Optional<S32> image_left_pad;
- Optional<S32> image_right_pad;
Optional<S32> image_top_pad;
Optional<S32> image_bottom_pad;
+ /**
+ * Space between image_overlay and label
+ */
+ Optional<S32> imgoverlay_label_space;
+
// callbacks
Optional<CommitCallbackParam> click_callback, // alias -> commit_callback
mouse_down_callback,
@@ -192,10 +195,6 @@ public:
void setLeftHPad( S32 pad ) { mLeftHPad = pad; }
void setRightHPad( S32 pad ) { mRightHPad = pad; }
- void setImageOverlayLeftPad( S32 pad ) { mImageOverlayLeftPad = pad; }
- S32 getImageOverlayLeftPad() const { return mImageOverlayLeftPad; }
- void setImageOverlayRightPad( S32 pad ) { mImageOverlayRightPad = pad; }
- S32 getImageOverlayRightPad() const { return mImageOverlayRightPad; }
void setImageOverlayTopPad( S32 pad ) { mImageOverlayTopPad = pad; }
S32 getImageOverlayTopPad() const { return mImageOverlayTopPad; }
void setImageOverlayBottomPad( S32 pad ) { mImageOverlayBottomPad = pad; }
@@ -328,11 +327,14 @@ private:
S32 mRightHPad;
S32 mBottomVPad; // under text label
- S32 mImageOverlayLeftPad;
- S32 mImageOverlayRightPad;
S32 mImageOverlayTopPad;
S32 mImageOverlayBottomPad;
+ /*
+ * Space between image_overlay and label
+ */
+ S32 mImgOverlayLabelSpace;
+
F32 mHoverGlowStrength;
F32 mCurGlowStrength;
diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp
index 0237c80efa..a4f69e7ac1 100644
--- a/indra/llui/llconsole.cpp
+++ b/indra/llui/llconsole.cpp
@@ -244,23 +244,6 @@ void LLConsole::draw()
}
}
-void LLConsole::addLine(const std::string& utf8line)
-{
- LLWString wline = utf8str_to_wstring(utf8line);
- addLine(wline, 0.f, LLColor4(1.f, 1.f, 1.f, 1.f));
-}
-
-void LLConsole::addLine(const LLWString& wline)
-{
- addLine(wline, 0.f, LLColor4(1.f, 1.f, 1.f, 1.f));
-}
-
-void LLConsole::addLine(const std::string& utf8line, F32 size, const LLColor4 &color)
-{
- LLWString wline = utf8str_to_wstring(utf8line);
- addLine(wline, size, color);
-}
-
//Generate highlight color segments for this paragraph. Pass in default color of paragraph.
void LLConsole::Paragraph::makeParagraphColorSegments (const LLColor4 &color)
{
@@ -383,21 +366,45 @@ void LLConsole::Paragraph::updateLines(F32 screen_width, const LLFontGL* font, b
//Pass in the string and the default color for this block of text.
LLConsole::Paragraph::Paragraph (LLWString str, const LLColor4 &color, F32 add_time, const LLFontGL* font, F32 screen_width)
- : mParagraphText(str), mAddTime(add_time), mMaxWidth(-1)
+: mParagraphText(str), mAddTime(add_time), mMaxWidth(-1)
{
makeParagraphColorSegments(color);
updateLines( screen_width, font );
}
-void LLConsole::addLine(const LLWString& wline, F32 size, const LLColor4 &color)
+// called once per frame regardless of console visibility
+// static
+void LLConsole::updateClass()
{
- Paragraph paragraph(wline, color, mTimer.getElapsedTimeF32(), mFont, (F32)getRect().getWidth() );
-
- mParagraphs.push_back ( paragraph );
+ LLInstanceTrackerScopedGuard guard;
+
+ for (instance_iter it = guard.beginInstances(); it != guard.endInstances(); ++it)
+ {
+ it->update();
+ }
+}
+
+void LLConsole::update()
+{
+ {
+ LLMutexLock lock(&mMutex);
+
+ while (!mLines.empty())
+ {
+ mParagraphs.push_back(
+ Paragraph( mLines.front(),
+ LLColor4::white,
+ mTimer.getElapsedTimeF32(),
+ mFont,
+ (F32)getRect().getWidth()));
+ mLines.pop_front();
+ }
+ }
// remove old paragraphs which can't possibly be visible any more. ::draw() will do something similar but more conservative - we do this here because ::draw() isn't guaranteed to ever be called! (i.e. the console isn't visible)
- while ((S32)mParagraphs.size() > llmax((S32)0, (S32)(mMaxLines)))
- {
- mParagraphs.pop_front();
- }
+ while ((S32)mParagraphs.size() > llmax((S32)0, (S32)(mMaxLines)))
+ {
+ mParagraphs.pop_front();
+ }
}
+
diff --git a/indra/llui/llconsole.h b/indra/llui/llconsole.h
index 4719950f28..f38e2bc9c2 100644
--- a/indra/llui/llconsole.h
+++ b/indra/llui/llconsole.h
@@ -40,7 +40,7 @@
class LLSD;
-class LLConsole : public LLFixedBuffer, public LLUICtrl
+class LLConsole : public LLFixedBuffer, public LLUICtrl, public LLInstanceTracker<LLConsole>
{
public:
typedef enum e_font_size
@@ -68,6 +68,9 @@ protected:
friend class LLUICtrlFactory;
public:
+ // call once per frame to pull data out of LLFixedBuffer
+ static void updateClass();
+
//A paragraph color segment defines the color of text in a line
//of text that was received for console display. It has no
//notion of line wraps, screen position, or the text it contains.
@@ -139,14 +142,12 @@ public:
// -1 = monospace, 0 means small, font size = 1 means big
void setFontSize(S32 size_index);
- void addLine(const std::string& utf8line, F32 size, const LLColor4 &color);
- void addLine(const LLWString& wline, F32 size, const LLColor4 &color);
// Overrides
/*virtual*/ void draw();
- /*virtual*/ void addLine(const std::string& utf8line);
- /*virtual*/ void addLine(const LLWString& line);
private:
+ void update();
+
F32 mLinePersistTime; // Age at which to stop drawing.
F32 mFadeTime; // Age at which to start fading
const LLFontGL* mFont;
diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp
index 57baf28dab..a94f0206a6 100644
--- a/indra/llui/lldockablefloater.cpp
+++ b/indra/llui/lldockablefloater.cpp
@@ -223,10 +223,10 @@ void LLDockableFloater::draw()
LLFloater::draw();
}
-void LLDockableFloater::setDockControl(LLDockControl* dockControl)
+void LLDockableFloater::setDockControl(LLDockControl* dockControl, bool docked /* = true */)
{
mDockControl.reset(dockControl);
- setDocked(mDockControl.get() != NULL && mDockControl.get()->isDockVisible());
+ setDocked(docked && mDockControl.get() != NULL && mDockControl.get()->isDockVisible());
}
const LLUIImagePtr& LLDockableFloater::getDockTongue()
diff --git a/indra/llui/lldockablefloater.h b/indra/llui/lldockablefloater.h
index 2b1ce99ae2..4d747390af 100644
--- a/indra/llui/lldockablefloater.h
+++ b/indra/llui/lldockablefloater.h
@@ -127,7 +127,7 @@ private:
void resetInstance();
protected:
- void setDockControl(LLDockControl* dockControl);
+ void setDockControl(LLDockControl* dockControl, bool docked = true);
const LLUIImagePtr& getDockTongue();
private:
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index 1aaba88c49..dc79550eb4 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -816,7 +816,10 @@ void LLLayoutStack::calcMinExtents()
//static
void LLLayoutStack::updateClass()
{
- for (LLLayoutStack::instance_iter it = beginInstances(); it != endInstances(); ++it)
+ LLInstanceTrackerScopedGuard guard;
+ for (LLLayoutStack::instance_iter it = guard.beginInstances();
+ it != guard.endInstances();
+ ++it)
{
it->updateLayout();
}
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index 3e277f47b5..483a394bbd 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -55,6 +55,7 @@
#include "llui.h"
#include "lluictrlfactory.h"
#include "llclipboard.h"
+#include "llmenugl.h"
//
// Imported globals
@@ -82,19 +83,6 @@ template class LLLineEditor* LLView::getChild<class LLLineEditor>(
// Member functions
//
-void LLLineEditor::PrevalidateNamedFuncs::declareValues()
-{
- declare("ascii", LLLineEditor::prevalidateASCII);
- declare("float", LLLineEditor::prevalidateFloat);
- declare("int", LLLineEditor::prevalidateInt);
- declare("positive_s32", LLLineEditor::prevalidatePositiveS32);
- declare("non_negative_s32", LLLineEditor::prevalidateNonNegativeS32);
- declare("alpha_num", LLLineEditor::prevalidateAlphaNum);
- declare("alpha_num_space", LLLineEditor::prevalidateAlphaNumSpace);
- declare("ascii_printable_no_pipe", LLLineEditor::prevalidateASCIIPrintableNoPipe);
- declare("ascii_printable_no_space", LLLineEditor::prevalidateASCIIPrintableNoSpace);
-}
-
LLLineEditor::Params::Params()
: max_length_bytes("max_length", 254),
keystroke_callback("keystroke_callback"),
@@ -164,7 +152,8 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
mTentativeFgColor(p.text_tentative_color()),
mHighlightColor(p.highlight_color()),
mPreeditBgColor(p.preedit_bg_color()),
- mGLFont(p.font)
+ mGLFont(p.font),
+ mContextMenuHandle()
{
llassert( mMaxLengthBytes > 0 );
@@ -191,6 +180,12 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
setCursor(mText.length());
setPrevalidate(p.prevalidate_callback());
+
+ LLContextMenu* menu = LLUICtrlFactory::instance().createFromFile<LLContextMenu>
+ ("menu_text_editor.xml",
+ LLMenuGL::sMenuContainer,
+ LLMenuHolderGL::child_registry_t::instance());
+ setContextMenu(menu);
}
LLLineEditor::~LLLineEditor()
@@ -667,6 +662,16 @@ BOOL LLLineEditor::handleMiddleMouseDown(S32 x, S32 y, MASK mask)
return TRUE;
}
+BOOL LLLineEditor::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ setFocus(TRUE);
+ if (!LLUICtrl::handleRightMouseDown(x, y, mask))
+ {
+ showContextMenu(x, y);
+ }
+ return TRUE;
+}
+
BOOL LLLineEditor::handleHover(S32 x, S32 y, MASK mask)
{
BOOL handled = FALSE;
@@ -1966,51 +1971,12 @@ void LLLineEditor::setRect(const LLRect& rect)
}
}
-void LLLineEditor::setPrevalidate(LLLinePrevalidateFunc func)
+void LLLineEditor::setPrevalidate(LLTextValidate::validate_func_t func)
{
mPrevalidateFunc = func;
updateAllowingLanguageInput();
}
-// Limits what characters can be used to [1234567890.-] with [-] only valid in the first position.
-// Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for
-// the simple reasons that intermediate states may be invalid even if the final result is valid.
-//
-// static
-BOOL LLLineEditor::prevalidateFloat(const LLWString &str)
-{
- LLLocale locale(LLLocale::USER_LOCALE);
-
- BOOL success = TRUE;
- LLWString trimmed = str;
- LLWStringUtil::trim(trimmed);
- S32 len = trimmed.length();
- if( 0 < len )
- {
- // May be a comma or period, depending on the locale
- llwchar decimal_point = (llwchar)LLResMgr::getInstance()->getDecimalPoint();
-
- S32 i = 0;
-
- // First character can be a negative sign
- if( '-' == trimmed[0] )
- {
- i++;
- }
-
- for( ; i < len; i++ )
- {
- if( (decimal_point != trimmed[i] ) && !LLStringOps::isDigit( trimmed[i] ) )
- {
- success = FALSE;
- break;
- }
- }
- }
-
- return success;
-}
-
// static
BOOL LLLineEditor::postvalidateFloat(const std::string &str)
{
@@ -2070,223 +2036,6 @@ BOOL LLLineEditor::postvalidateFloat(const std::string &str)
return success;
}
-// Limits what characters can be used to [1234567890-] with [-] only valid in the first position.
-// Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for
-// the simple reasons that intermediate states may be invalid even if the final result is valid.
-//
-// static
-BOOL LLLineEditor::prevalidateInt(const LLWString &str)
-{
- LLLocale locale(LLLocale::USER_LOCALE);
-
- BOOL success = TRUE;
- LLWString trimmed = str;
- LLWStringUtil::trim(trimmed);
- S32 len = trimmed.length();
- if( 0 < len )
- {
- S32 i = 0;
-
- // First character can be a negative sign
- if( '-' == trimmed[0] )
- {
- i++;
- }
-
- for( ; i < len; i++ )
- {
- if( !LLStringOps::isDigit( trimmed[i] ) )
- {
- success = FALSE;
- break;
- }
- }
- }
-
- return success;
-}
-
-// static
-BOOL LLLineEditor::prevalidatePositiveS32(const LLWString &str)
-{
- LLLocale locale(LLLocale::USER_LOCALE);
-
- LLWString trimmed = str;
- LLWStringUtil::trim(trimmed);
- S32 len = trimmed.length();
- BOOL success = TRUE;
- if(0 < len)
- {
- if(('-' == trimmed[0]) || ('0' == trimmed[0]))
- {
- success = FALSE;
- }
- S32 i = 0;
- while(success && (i < len))
- {
- if(!LLStringOps::isDigit(trimmed[i++]))
- {
- success = FALSE;
- }
- }
- }
- if (success)
- {
- S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10);
- if (val <= 0)
- {
- success = FALSE;
- }
- }
- return success;
-}
-
-BOOL LLLineEditor::prevalidateNonNegativeS32(const LLWString &str)
-{
- LLLocale locale(LLLocale::USER_LOCALE);
-
- LLWString trimmed = str;
- LLWStringUtil::trim(trimmed);
- S32 len = trimmed.length();
- BOOL success = TRUE;
- if(0 < len)
- {
- if('-' == trimmed[0])
- {
- success = FALSE;
- }
- S32 i = 0;
- while(success && (i < len))
- {
- if(!LLStringOps::isDigit(trimmed[i++]))
- {
- success = FALSE;
- }
- }
- }
- if (success)
- {
- S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10);
- if (val < 0)
- {
- success = FALSE;
- }
- }
- return success;
-}
-
-BOOL LLLineEditor::prevalidateAlphaNum(const LLWString &str)
-{
- LLLocale locale(LLLocale::USER_LOCALE);
-
- BOOL rv = TRUE;
- S32 len = str.length();
- if(len == 0) return rv;
- while(len--)
- {
- if( !LLStringOps::isAlnum((char)str[len]) )
- {
- rv = FALSE;
- break;
- }
- }
- return rv;
-}
-
-// static
-BOOL LLLineEditor::prevalidateAlphaNumSpace(const LLWString &str)
-{
- LLLocale locale(LLLocale::USER_LOCALE);
-
- BOOL rv = TRUE;
- S32 len = str.length();
- if(len == 0) return rv;
- while(len--)
- {
- if(!(LLStringOps::isAlnum((char)str[len]) || (' ' == str[len])))
- {
- rv = FALSE;
- break;
- }
- }
- return rv;
-}
-
-// Used for most names of things stored on the server, due to old file-formats
-// that used the pipe (|) for multiline text storage. Examples include
-// inventory item names, parcel names, object names, etc.
-// static
-BOOL LLLineEditor::prevalidateASCIIPrintableNoPipe(const LLWString &str)
-{
- BOOL rv = TRUE;
- S32 len = str.length();
- if(len == 0) return rv;
- while(len--)
- {
- llwchar wc = str[len];
- if (wc < 0x20
- || wc > 0x7f
- || wc == '|')
- {
- rv = FALSE;
- break;
- }
- if(!(wc == ' '
- || LLStringOps::isAlnum((char)wc)
- || LLStringOps::isPunct((char)wc) ) )
- {
- rv = FALSE;
- break;
- }
- }
- return rv;
-}
-
-
-// Used for avatar names
-// static
-BOOL LLLineEditor::prevalidateASCIIPrintableNoSpace(const LLWString &str)
-{
- BOOL rv = TRUE;
- S32 len = str.length();
- if(len == 0) return rv;
- while(len--)
- {
- llwchar wc = str[len];
- if (wc < 0x20
- || wc > 0x7f
- || LLStringOps::isSpace(wc))
- {
- rv = FALSE;
- break;
- }
- if( !(LLStringOps::isAlnum((char)str[len]) ||
- LLStringOps::isPunct((char)str[len]) ) )
- {
- rv = FALSE;
- break;
- }
- }
- return rv;
-}
-
-
-// static
-BOOL LLLineEditor::prevalidateASCII(const LLWString &str)
-{
- BOOL rv = TRUE;
- S32 len = str.length();
- while(len--)
- {
- if (str[len] < 0x20 || str[len] > 0x7f)
- {
- rv = FALSE;
- break;
- }
- }
- return rv;
-}
-
void LLLineEditor::onMouseCaptureLost()
{
endSelection();
@@ -2564,3 +2313,25 @@ LLWString LLLineEditor::getConvertedText() const
}
return text;
}
+
+void LLLineEditor::showContextMenu(S32 x, S32 y)
+{
+ LLContextMenu* menu = static_cast<LLContextMenu*>(mContextMenuHandle.get());
+
+ if (menu)
+ {
+ gEditMenuHandler = this;
+
+ S32 screen_x, screen_y;
+ localPointToScreen(x, y, &screen_x, &screen_y);
+ menu->show(screen_x, screen_y);
+ }
+}
+
+void LLLineEditor::setContextMenu(LLContextMenu* new_context_menu)
+{
+ if (new_context_menu)
+ mContextMenuHandle = new_context_menu->getHandle();
+ else
+ mContextMenuHandle.markDead();
+}
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index 49e9539b16..b62138426b 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -51,26 +51,18 @@
#include "llviewborder.h"
#include "llpreeditor.h"
-#include <boost/function.hpp>
+#include "lltextvalidate.h"
class LLFontGL;
class LLLineEditorRollback;
class LLButton;
-
-typedef boost::function<BOOL (const LLWString &wstr)> LLLinePrevalidateFunc;
+class LLContextMenu;
class LLLineEditor
: public LLUICtrl, public LLEditMenuHandler, protected LLPreeditor
{
public:
- struct PrevalidateNamedFuncs
- : public LLInitParam::TypeValuesHelper<LLLinePrevalidateFunc, PrevalidateNamedFuncs>
-
- {
- static void declareValues();
- };
-
typedef boost::function<void (LLLineEditor* caller)> keystroke_callback_t;
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
@@ -80,7 +72,7 @@ public:
Optional<keystroke_callback_t> keystroke_callback;
- Optional<LLLinePrevalidateFunc, PrevalidateNamedFuncs> prevalidate_callback;
+ Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs> prevalidate_callback;
Optional<LLViewBorder::Params> border;
@@ -113,6 +105,7 @@ protected:
LLLineEditor(const Params&);
friend class LLUICtrlFactory;
friend class LLFloaterEditUI;
+ void showContextMenu(S32 x, S32 y);
public:
virtual ~LLLineEditor();
@@ -122,6 +115,7 @@ public:
/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleDoubleClick(S32 x,S32 y,MASK mask);
/*virtual*/ BOOL handleMiddleMouseDown(S32 x,S32 y,MASK mask);
+ /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask );
/*virtual*/ BOOL handleUnicodeCharHere(llwchar uni_char);
/*virtual*/ void onMouseCaptureLost();
@@ -204,6 +198,8 @@ public:
const LLColor4& getReadOnlyFgColor() const { return mReadOnlyFgColor.get(); }
const LLColor4& getTentativeFgColor() const { return mTentativeFgColor.get(); }
+ const LLFontGL* getFont() const { return mGLFont; }
+
void setIgnoreArrowKeys(BOOL b) { mIgnoreArrowKeys = b; }
void setIgnoreTab(BOOL b) { mIgnoreTab = b; }
void setPassDelete(BOOL b) { mPassDelete = b; }
@@ -231,17 +227,7 @@ public:
void setTextPadding(S32 left, S32 right);
// Prevalidation controls which keystrokes can affect the editor
- void setPrevalidate( LLLinePrevalidateFunc func );
- static BOOL prevalidateFloat(const LLWString &str );
- static BOOL prevalidateInt(const LLWString &str );
- static BOOL prevalidatePositiveS32(const LLWString &str);
- static BOOL prevalidateNonNegativeS32(const LLWString &str);
- static BOOL prevalidateAlphaNum(const LLWString &str );
- static BOOL prevalidateAlphaNumSpace(const LLWString &str );
- static BOOL prevalidateASCIIPrintableNoPipe(const LLWString &str);
- static BOOL prevalidateASCIIPrintableNoSpace(const LLWString &str);
- static BOOL prevalidateASCII(const LLWString &str);
-
+ void setPrevalidate( LLTextValidate::validate_func_t func );
static BOOL postvalidateFloat(const std::string &str);
// line history support:
@@ -249,7 +235,9 @@ public:
void updateHistory(); // stores current line in history
void setReplaceNewlinesWithSpaces(BOOL replace);
-
+
+ void setContextMenu(LLContextMenu* new_context_menu);
+
private:
// private helper methods
@@ -319,7 +307,7 @@ protected:
S32 mLastSelectionStart;
S32 mLastSelectionEnd;
- LLLinePrevalidateFunc mPrevalidateFunc;
+ LLTextValidate::validate_func_t mPrevalidateFunc;
LLFrameTimer mKeystrokeTimer;
LLTimer mTripleClickTimer;
@@ -348,6 +336,8 @@ protected:
std::vector<S32> mPreeditPositions;
LLPreeditor::standouts_t mPreeditStandouts;
+ LLHandle<LLView> mContextMenuHandle;
+
private:
// Instances that by default point to the statics but can be overidden in XML.
LLPointer<LLUIImage> mBgImage;
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 7fa9a88059..d18abbfb2f 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -3941,7 +3941,6 @@ BOOL LLContextMenu::appendContextSubMenu(LLContextMenu *menu)
item = LLUICtrlFactory::create<LLContextMenuBranch>(p);
LLMenuGL::sMenuContainer->addChild(item->getBranch());
- item->setFont( LLFontGL::getFontSansSerif() );
return append( item );
}
diff --git a/indra/llui/llmultifloater.cpp b/indra/llui/llmultifloater.cpp
index 78738c826d..33d47a3f0e 100644
--- a/indra/llui/llmultifloater.cpp
+++ b/indra/llui/llmultifloater.cpp
@@ -92,14 +92,6 @@ void LLMultiFloater::draw()
}
else
{
- for (S32 i = 0; i < mTabContainer->getTabCount(); i++)
- {
- LLFloater* floaterp = (LLFloater*)mTabContainer->getPanelByIndex(i);
- if (floaterp->getShortTitle() != mTabContainer->getPanelTitle(i))
- {
- mTabContainer->setPanelTitle(i, floaterp->getShortTitle());
- }
- }
LLFloater::draw();
}
}
diff --git a/indra/llui/llmultisliderctrl.cpp b/indra/llui/llmultisliderctrl.cpp
index f4434a0f78..50942e55ca 100644
--- a/indra/llui/llmultisliderctrl.cpp
+++ b/indra/llui/llmultisliderctrl.cpp
@@ -138,7 +138,7 @@ LLMultiSliderCtrl::LLMultiSliderCtrl(const LLMultiSliderCtrl::Params& p)
params.font(p.font);
params.max_length_bytes(MAX_STRING_LENGTH);
params.commit_callback.function(LLMultiSliderCtrl::onEditorCommit);
- params.prevalidate_callback(&LLLineEditor::prevalidateFloat);
+ params.prevalidate_callback(&LLTextValidate::validateFloat);
params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);
mEditor = LLUICtrlFactory::create<LLLineEditor> (params);
mEditor->setFocusReceivedCallback( boost::bind(LLMultiSliderCtrl::onEditorGainFocus, _1, this) );
@@ -331,6 +331,10 @@ void LLMultiSliderCtrl::updateText()
void LLMultiSliderCtrl::onEditorCommit( LLUICtrl* ctrl, const LLSD& userdata)
{
LLMultiSliderCtrl* self = dynamic_cast<LLMultiSliderCtrl*>(ctrl->getParent());
+ llassert(self);
+ if (!self) // cast failed - wrong type! :O
+ return;
+
if (!ctrl)
return;
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 7f23fe2671..7b406e090a 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -936,7 +936,7 @@ LLPanel *LLPanel::childGetVisiblePanelWithHelp()
return ::childGetVisiblePanelWithHelp(this);
}
-void LLPanel::childSetPrevalidate(const std::string& id, BOOL (*func)(const LLWString &) )
+void LLPanel::childSetPrevalidate(const std::string& id, bool (*func)(const LLWString &) )
{
LLLineEditor* child = findChild<LLLineEditor>(id);
if (child)
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index 6de83fe3a7..4e53fd7ea3 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -226,7 +226,7 @@ public:
std::string childGetText(const std::string& id) const { return childGetValue(id).asString(); }
// LLLineEditor
- void childSetPrevalidate(const std::string& id, BOOL (*func)(const LLWString &) );
+ void childSetPrevalidate(const std::string& id, bool (*func)(const LLWString &) );
// LLButton
void childSetAction(const std::string& id, boost::function<void(void*)> function, void* value = NULL);
diff --git a/indra/llui/llsearcheditor.cpp b/indra/llui/llsearcheditor.cpp
index 6fa99df82e..491eeeab54 100644
--- a/indra/llui/llsearcheditor.cpp
+++ b/indra/llui/llsearcheditor.cpp
@@ -60,6 +60,7 @@ LLSearchEditor::LLSearchEditor(const LLSearchEditor::Params& p)
line_editor_params.keystroke_callback(boost::bind(&LLSearchEditor::handleKeystroke, this));
mSearchEditor = LLUICtrlFactory::create<LLLineEditor>(line_editor_params);
+ mSearchEditor->setPassDelete(TRUE);
addChild(mSearchEditor);
if (p.search_button_visible)
@@ -79,10 +80,12 @@ LLSearchEditor::LLSearchEditor(const LLSearchEditor::Params& p)
if (p.clear_button_visible)
{
// Set up clear button.
- S32 clr_btn_width = getRect().getHeight(); // button is square, and as tall as search editor
- LLRect clear_btn_rect(getRect().getWidth() - clr_btn_width, getRect().getHeight(), getRect().getWidth(), 0);
LLButton::Params clr_btn_params(p.clear_button);
clr_btn_params.name(std::string("clear button"));
+ S32 clr_btn_top = clr_btn_params.rect.bottom + clr_btn_params.rect.height;
+ S32 clr_btn_right = getRect().getWidth() - clr_btn_params.pad_right;
+ S32 clr_btn_left = clr_btn_right - clr_btn_params.rect.width;
+ LLRect clear_btn_rect(clr_btn_left, clr_btn_top, clr_btn_right, p.clear_button.rect.bottom);
clr_btn_params.rect(clear_btn_rect) ;
clr_btn_params.follows.flags(FOLLOWS_RIGHT|FOLLOWS_TOP);
clr_btn_params.tab_stop(false);
diff --git a/indra/llui/llsliderctrl.cpp b/indra/llui/llsliderctrl.cpp
index 01c274bb4e..80ee5d0984 100644
--- a/indra/llui/llsliderctrl.cpp
+++ b/indra/llui/llsliderctrl.cpp
@@ -141,7 +141,7 @@ LLSliderCtrl::LLSliderCtrl(const LLSliderCtrl::Params& p)
line_p.rect.setIfNotProvided(text_rect);
line_p.font.setIfNotProvided(p.font);
line_p.commit_callback.function(&LLSliderCtrl::onEditorCommit);
- line_p.prevalidate_callback(&LLLineEditor::prevalidateFloat);
+ line_p.prevalidate_callback(&LLTextValidate::validateFloat);
mEditor = LLUICtrlFactory::create<LLLineEditor>(line_p);
mEditor->setFocusReceivedCallback( boost::bind(&LLSliderCtrl::onEditorGainFocus, _1, this ));
diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp
index 28f3788817..491cd7b6f3 100644
--- a/indra/llui/llspinctrl.cpp
+++ b/indra/llui/llspinctrl.cpp
@@ -127,7 +127,7 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)
}
params.max_length_bytes(MAX_STRING_LENGTH);
params.commit_callback.function((boost::bind(&LLSpinCtrl::onEditorCommit, this, _2)));
- params.prevalidate_callback(&LLLineEditor::prevalidateFloat);
+ params.prevalidate_callback(&LLTextValidate::validateFloat);
params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);
mEditor = LLUICtrlFactory::create<LLLineEditor> (params);
mEditor->setFocusReceivedCallback( boost::bind(&LLSpinCtrl::onEditorGainFocus, _1, this ));
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index f11bc2173c..575b6e3b6c 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -35,7 +35,6 @@
#include "lltabcontainer.h"
#include "llfocusmgr.h"
-#include "llbutton.h"
#include "lllocalcliprect.h"
#include "llrect.h"
#include "llresizehandle.h"
@@ -96,6 +95,91 @@ public:
//----------------------------------------------------------------------------
+//============================================================================
+/*
+ * @file lltabcontainer.cpp
+ * @brief class implements LLButton with LLIconCtrl on it
+ */
+class LLCustomButtonIconCtrl : public LLButton
+{
+public:
+ struct Params
+ : public LLInitParam::Block<Params, LLButton::Params>
+ {
+ // LEFT, RIGHT, TOP, BOTTOM paddings of LLIconCtrl in this class has same value
+ Optional<S32> icon_ctrl_pad;
+
+ Params():
+ icon_ctrl_pad("icon_ctrl_pad", 1)
+ {}
+ };
+
+protected:
+ friend class LLUICtrlFactory;
+ LLCustomButtonIconCtrl(const Params& p):
+ LLButton(p),
+ mIcon(NULL),
+ mIconAlignment(LLFontGL::HCENTER),
+ mIconCtrlPad(p.icon_ctrl_pad)
+ {}
+
+public:
+
+ void updateLayout()
+ {
+ LLRect button_rect = getRect();
+ LLRect icon_rect = mIcon->getRect();
+
+ S32 icon_size = button_rect.getHeight() - 2*mIconCtrlPad;
+
+ switch(mIconAlignment)
+ {
+ case LLFontGL::LEFT:
+ icon_rect.setLeftTopAndSize(button_rect.mLeft + mIconCtrlPad, button_rect.mTop - mIconCtrlPad,
+ icon_size, icon_size);
+ setLeftHPad(icon_size + mIconCtrlPad * 2);
+ break;
+ case LLFontGL::HCENTER:
+ icon_rect.setLeftTopAndSize(button_rect.mRight - (button_rect.getWidth() + mIconCtrlPad - icon_size)/2, button_rect.mTop - mIconCtrlPad,
+ icon_size, icon_size);
+ setRightHPad(icon_size + mIconCtrlPad * 2);
+ break;
+ case LLFontGL::RIGHT:
+ icon_rect.setLeftTopAndSize(button_rect.mRight - mIconCtrlPad - icon_size, button_rect.mTop - mIconCtrlPad,
+ icon_size, icon_size);
+ setRightHPad(icon_size + mIconCtrlPad * 2);
+ break;
+ default:
+ break;
+ }
+ mIcon->setRect(icon_rect);
+ }
+
+ void setIcon(LLIconCtrl* icon, LLFontGL::HAlign alignment = LLFontGL::LEFT)
+ {
+ if(icon)
+ {
+ if(mIcon)
+ {
+ removeChild(mIcon);
+ mIcon->die();
+ }
+ mIcon = icon;
+ mIconAlignment = alignment;
+
+ addChild(mIcon);
+ updateLayout();
+ }
+ }
+
+
+private:
+ LLIconCtrl* mIcon;
+ LLFontGL::HAlign mIconAlignment;
+ S32 mIconCtrlPad;
+};
+//============================================================================
+
struct LLPlaceHolderPanel : public LLPanel
{
// create dummy param block to register with "placeholder" nane
@@ -127,7 +211,10 @@ LLTabContainer::Params::Params()
tab_padding_right("tab_padding_right"),
first_tab("first_tab"),
middle_tab("middle_tab"),
- last_tab("last_tab")
+ last_tab("last_tab"),
+ use_custom_icon_ctrl("use_custom_icon_ctrl", false),
+ tab_icon_ctrl_pad("tab_icon_ctrl_pad", 0),
+ use_ellipses("use_ellipses")
{
name(std::string("tab_container"));
mouse_opaque = false;
@@ -162,7 +249,10 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p)
mFont(p.font),
mFirstTabParams(p.first_tab),
mMiddleTabParams(p.middle_tab),
- mLastTabParams(p.last_tab)
+ mLastTabParams(p.last_tab),
+ mCustomIconCtrlUsed(p.use_custom_icon_ctrl),
+ mTabIconCtrlPad(p.tab_icon_ctrl_pad),
+ mUseTabEllipses(p.use_ellipses)
{
static LLUICachedControl<S32> tabcntr_vert_tab_min_width ("UITabCntrVertTabMinWidth", 0);
@@ -905,6 +995,11 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
LLTextBox* textbox = NULL;
LLButton* btn = NULL;
+ LLCustomButtonIconCtrl::Params custom_btn_params;
+ {
+ custom_btn_params.icon_ctrl_pad(mTabIconCtrlPad);
+ }
+ LLButton::Params normal_btn_params;
if (placeholder)
{
@@ -924,7 +1019,9 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
{
if (mIsVertical)
{
- LLButton::Params p;
+ LLButton::Params& p = (mCustomIconCtrlUsed)?
+ custom_btn_params:normal_btn_params;
+
p.name(std::string("vert tab button"));
p.rect(btn_rect);
p.follows.flags(FOLLOWS_TOP | FOLLOWS_LEFT);
@@ -942,11 +1039,22 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
{
p.pad_left(indent);
}
- btn = LLUICtrlFactory::create<LLButton>(p);
+
+
+ if(mCustomIconCtrlUsed)
+ {
+ btn = LLUICtrlFactory::create<LLCustomButtonIconCtrl>(custom_btn_params);
+
+ }
+ else
+ {
+ btn = LLUICtrlFactory::create<LLButton>(p);
+ }
}
else
{
- LLButton::Params p;
+ LLButton::Params& p = (mCustomIconCtrlUsed)?
+ custom_btn_params:normal_btn_params;
p.name(std::string(child->getName()) + " tab");
p.rect(btn_rect);
p.click_callback.function(boost::bind(&LLTabContainer::onTabBtn, this, _2, child));
@@ -980,7 +1088,14 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
p.follows.flags = p.follows.flags() | FOLLOWS_BOTTOM;
}
-++ btn = LLUICtrlFactory::create<LLButton>(p);
+ if(mCustomIconCtrlUsed)
+ {
+ btn = LLUICtrlFactory::create<LLCustomButtonIconCtrl>(custom_btn_params);
+ }
+ else
+ {
+ btn = LLUICtrlFactory::create<LLButton>(p);
+ }
}
}
@@ -1373,8 +1488,8 @@ BOOL LLTabContainer::setTab(S32 which)
{
LLTabTuple* tuple = *iter;
BOOL is_selected = ( tuple == selected_tuple );
- tuple->mButton->setUseEllipses(TRUE);
- tuple->mButton->setHAlign(LLFontGL::LEFT);
+ tuple->mButton->setUseEllipses(mUseTabEllipses);
+ tuple->mButton->setHAlign(mFontHalign);
tuple->mTabPanel->setVisible( is_selected );
// tuple->mTabPanel->setFocus(is_selected); // not clear that we want to do this here.
tuple->mButton->setToggleState( is_selected );
@@ -1484,7 +1599,7 @@ void LLTabContainer::setTabImage(LLPanel* child, std::string image_name, const L
if( tuple )
{
tuple->mButton->setImageOverlay(image_name, LLFontGL::LEFT, color);
- reshape_tuple(tuple);
+ reshapeTuple(tuple);
}
}
@@ -1494,25 +1609,31 @@ void LLTabContainer::setTabImage(LLPanel* child, const LLUUID& image_id, const L
if( tuple )
{
tuple->mButton->setImageOverlay(image_id, LLFontGL::LEFT, color);
- reshape_tuple(tuple);
+ reshapeTuple(tuple);
}
}
-void LLTabContainer::reshape_tuple(LLTabTuple* tuple)
+void LLTabContainer::setTabImage(LLPanel* child, LLIconCtrl* icon)
+{
+ LLTabTuple* tuple = getTabByPanel(child);
+ LLCustomButtonIconCtrl* button;
+
+ if(tuple)
+ {
+ button = dynamic_cast<LLCustomButtonIconCtrl*>(tuple->mButton);
+ if(button)
+ {
+ button->setIcon(icon);
+ }
+ }
+}
+
+void LLTabContainer::reshapeTuple(LLTabTuple* tuple)
{
static LLUICachedControl<S32> tab_padding ("UITabPadding", 0);
- static LLUICachedControl<S32> image_left_padding ("UIButtonImageLeftPadding", 4);
- static LLUICachedControl<S32> image_right_padding ("UIButtonImageRightPadding", 4);
- static LLUICachedControl<S32> image_top_padding ("UIButtonImageTopPadding", 2);
- static LLUICachedControl<S32> image_bottom_padding ("UIButtonImageBottomPadding", 2);
if (!mIsVertical)
{
- tuple->mButton->setImageOverlayLeftPad(image_left_padding);
- tuple->mButton->setImageOverlayRightPad(image_right_padding);
- tuple->mButton->setImageOverlayTopPad(image_top_padding);
- tuple->mButton->setImageOverlayBottomPad(image_bottom_padding);
-
// remove current width from total tab strip width
mTotalTabWidth -= tuple->mButton->getRect().getWidth();
diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h
index 2a55877d3c..50ec2679f6 100644
--- a/indra/llui/lltabcontainer.h
+++ b/indra/llui/lltabcontainer.h
@@ -36,6 +36,8 @@
#include "llpanel.h"
#include "lltextbox.h"
#include "llframetimer.h"
+#include "lliconctrl.h"
+#include "llbutton.h"
class LLTabTuple;
@@ -90,6 +92,26 @@ public:
middle_tab,
last_tab;
+ /**
+ * Tab label horizontal alignment
+ */
+ Optional<LLFontGL::HAlign> font_halign;
+
+ /**
+ * Tab label ellipses
+ */
+ Optional<bool> use_ellipses;
+
+ /**
+ * Use LLCustomButtonIconCtrl or LLButton in LLTabTuple
+ */
+ Optional<bool> use_custom_icon_ctrl;
+
+ /**
+ * Paddings for LLIconCtrl in case of LLCustomButtonIconCtrl usage(use_custom_icon_ctrl = true)
+ */
+ Optional<S32> tab_icon_ctrl_pad;
+
Params();
};
@@ -173,6 +195,7 @@ public:
void setTabPanelFlashing(LLPanel* child, BOOL state);
void setTabImage(LLPanel* child, std::string img_name, const LLColor4& color = LLColor4::white);
void setTabImage(LLPanel* child, const LLUUID& img_id, const LLColor4& color = LLColor4::white);
+ void setTabImage(LLPanel* child, LLIconCtrl* icon);
void setTitle( const std::string& title );
const std::string getPanelTitle(S32 index);
@@ -228,7 +251,7 @@ private:
// updates tab button images given the tuple, tab position and the corresponding params
void update_images(LLTabTuple* tuple, TabParams params, LLTabContainer::TabPosition pos);
- void reshape_tuple(LLTabTuple* tuple);
+ void reshapeTuple(LLTabTuple* tuple);
// Variables
@@ -278,6 +301,10 @@ private:
TabParams mFirstTabParams;
TabParams mMiddleTabParams;
TabParams mLastTabParams;
+
+ bool mCustomIconCtrlUsed;
+ S32 mTabIconCtrlPad;
+ bool mUseTabEllipses;
};
#endif // LL_TABCONTAINER_H
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 2b1e2b8226..b84e6f45fb 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1137,6 +1137,7 @@ void LLTextBase::reflow()
line_list_t::iterator iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), start_index, line_end_compare());
line_start_index = iter->mDocIndexStart;
line_count = iter->mLineNum;
+ cur_top = iter->mRect.mTop;
getSegmentAndOffset(iter->mDocIndexStart, &seg_iter, &seg_offset);
mLineInfoList.erase(iter, mLineInfoList.end());
}
@@ -1574,8 +1575,10 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c
{
LLStyle::Params icon;
icon.image = image;
- // HACK: fix spacing of images and remove the fixed char spacing
- appendAndHighlightText(" ", prepend_newline, part, icon);
+ // Text will be replaced during rendering with the icon,
+ // but string cannot be empty or the segment won't be
+ // added (or drawn).
+ appendAndHighlightText(" ", prepend_newline, part, icon);
prepend_newline = false;
}
}
@@ -2296,14 +2299,21 @@ F32 LLNormalTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 selec
{
if ( mStyle->isImage() && (start >= 0) && (end <= mEnd - mStart))
{
+ // ...for images, only render the image, not the underlying text,
+ // which is only a placeholder space
LLColor4 color = LLColor4::white % mEditor.getDrawContext().mAlpha;
LLUIImagePtr image = mStyle->getImage();
S32 style_image_height = image->getHeight();
S32 style_image_width = image->getWidth();
- // Center the image vertically
- S32 image_bottom = draw_rect.getCenterY() - (style_image_height/2);
+ // Text is drawn from the top of the draw_rect downward
+ S32 text_center = draw_rect.mTop - (mFontHeight / 2);
+ // Align image to center of text
+ S32 image_bottom = text_center - (style_image_height / 2);
image->draw(draw_rect.mLeft, image_bottom,
style_image_width, style_image_height, color);
+
+ const S32 IMAGE_HPAD = 3;
+ return draw_rect.mLeft + style_image_width + IMAGE_HPAD;
}
return drawClippedSegment( getStart() + start, getStart() + end, selection_start, selection_end, draw_rect);
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 3fdb48b3ca..ce5f1bd082 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -237,13 +237,17 @@ private:
///////////////////////////////////////////////////////////////////
LLTextEditor::Params::Params()
: default_text("default_text"),
+ prevalidate_callback("prevalidate_callback"),
embedded_items("embedded_items", false),
ignore_tab("ignore_tab", true),
handle_edit_keys_directly("handle_edit_keys_directly", false),
show_line_numbers("show_line_numbers", false),
default_color("default_color"),
- commit_on_focus_lost("commit_on_focus_lost", false)
-{}
+ commit_on_focus_lost("commit_on_focus_lost", false),
+ show_context_menu("show_context_menu")
+{
+ addSynonym(prevalidate_callback, "text_type");
+}
LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :
LLTextBase(p),
@@ -258,7 +262,9 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :
mMouseDownX(0),
mMouseDownY(0),
mTabsToNextField(p.ignore_tab),
- mContextMenu(NULL)
+ mPrevalidateFunc(p.prevalidate_callback()),
+ mContextMenu(NULL),
+ mShowContextMenu(p.show_context_menu)
{
mDefaultFont = p.font;
@@ -318,6 +324,17 @@ LLTextEditor::~LLTextEditor()
void LLTextEditor::setText(const LLStringExplicit &utf8str, const LLStyle::Params& input_params)
{
+ // validate incoming text if necessary
+ if (mPrevalidateFunc)
+ {
+ LLWString test_text = utf8str_to_wstring(utf8str);
+ if (!mPrevalidateFunc(test_text))
+ {
+ // not valid text, nothing to do
+ return;
+ }
+ }
+
blockUndo();
deselect();
@@ -720,7 +737,7 @@ BOOL LLTextEditor::handleRightMouseDown(S32 x, S32 y, MASK mask)
}
if (!LLTextBase::handleRightMouseDown(x, y, mask))
{
- if(getMouseOpaque())
+ if(getShowContextMenu())
{
showContextMenu(x, y);
}
@@ -909,6 +926,21 @@ S32 LLTextEditor::execute( TextCmd* cmd )
// Push the new command is now on the top (front) of the undo stack.
mUndoStack.push_front(cmd);
mLastCmd = cmd;
+
+ bool need_to_rollback = mPrevalidateFunc
+ && !mPrevalidateFunc(getViewModel()->getDisplay());
+ if (need_to_rollback)
+ {
+ // get rid of this last command and clean up undo stack
+ undo();
+
+ // remove any evidence of this command from redo history
+ mUndoStack.pop_front();
+ delete cmd;
+
+ // failure, nothing changed
+ delta = 0;
+ }
}
else
{
@@ -1032,7 +1064,21 @@ S32 LLTextEditor::addChar(S32 pos, llwchar wc)
if (mLastCmd && mLastCmd->canExtend(pos))
{
S32 delta = 0;
+ if (mPrevalidateFunc)
+ {
+ // get a copy of current text contents
+ LLWString test_string(getViewModel()->getDisplay());
+
+ // modify text contents as if this addChar succeeded
+ llassert(pos <= (S32)test_string.size());
+ test_string.insert(pos, 1, wc);
+ if (!mPrevalidateFunc( test_string))
+ {
+ return 0;
+ }
+ }
mLastCmd->extendAndExecute(this, pos, wc, &delta);
+
return delta;
}
else
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index a136f9ccce..71d937b2c4 100644
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -44,6 +44,7 @@
#include "lldarray.h"
#include "llviewborder.h" // for params
#include "lltextbase.h"
+#include "lltextvalidate.h"
#include "llpreeditor.h"
#include "llcontrol.h"
@@ -63,12 +64,14 @@ public:
struct Params : public LLInitParam::Block<Params, LLTextBase::Params>
{
Optional<std::string> default_text;
+ Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs> prevalidate_callback;
Optional<bool> embedded_items,
ignore_tab,
handle_edit_keys_directly,
show_line_numbers,
- commit_on_focus_lost;
+ commit_on_focus_lost,
+ show_context_menu;
//colors
Optional<LLUIColor> default_color;
@@ -200,6 +203,9 @@ public:
const LLTextSegmentPtr getPreviousSegment() const;
void getSelectedSegments(segment_vec_t& segments) const;
+ void setShowContextMenu(bool show) { mShowContextMenu = show; }
+ bool getShowContextMenu() const { return mShowContextMenu; }
+
protected:
void showContextMenu(S32 x, S32 y);
void drawPreeditMarker();
@@ -319,6 +325,7 @@ private:
BOOL mTakesFocus;
BOOL mAllowEmbeddedItems;
+ bool mShowContextMenu;
LLUUID mSourceID;
@@ -329,6 +336,7 @@ private:
LLCoordGL mLastIMEPosition; // Last position of the IME editor
keystroke_signal_t mKeystrokeSignal;
+ LLTextValidate::validate_func_t mPrevalidateFunc;
LLContextMenu* mContextMenu;
}; // end class LLTextEditor
diff --git a/indra/llui/lltextvalidate.cpp b/indra/llui/lltextvalidate.cpp
new file mode 100644
index 0000000000..8b6bc5bd7d
--- /dev/null
+++ b/indra/llui/lltextvalidate.cpp
@@ -0,0 +1,302 @@
+/**
+ * @file lltextvalidate.cpp
+ * @brief Text validation helper functions
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+// Text editor widget to let users enter a single line.
+
+#include "linden_common.h"
+
+#include "lltextvalidate.h"
+#include "llresmgr.h" // for LLLocale
+
+namespace LLTextValidate
+{
+ void ValidateTextNamedFuncs::declareValues()
+ {
+ declare("ascii", validateASCII);
+ declare("float", validateFloat);
+ declare("int", validateInt);
+ declare("positive_s32", validatePositiveS32);
+ declare("non_negative_s32", validateNonNegativeS32);
+ declare("alpha_num", validateAlphaNum);
+ declare("alpha_num_space", validateAlphaNumSpace);
+ declare("ascii_printable_no_pipe", validateASCIIPrintableNoPipe);
+ declare("ascii_printable_no_space", validateASCIIPrintableNoSpace);
+ }
+
+ // Limits what characters can be used to [1234567890.-] with [-] only valid in the first position.
+ // Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for
+ // the simple reasons that intermediate states may be invalid even if the final result is valid.
+ //
+ bool validateFloat(const LLWString &str)
+ {
+ LLLocale locale(LLLocale::USER_LOCALE);
+
+ bool success = TRUE;
+ LLWString trimmed = str;
+ LLWStringUtil::trim(trimmed);
+ S32 len = trimmed.length();
+ if( 0 < len )
+ {
+ // May be a comma or period, depending on the locale
+ llwchar decimal_point = (llwchar)LLResMgr::getInstance()->getDecimalPoint();
+
+ S32 i = 0;
+
+ // First character can be a negative sign
+ if( '-' == trimmed[0] )
+ {
+ i++;
+ }
+
+ for( ; i < len; i++ )
+ {
+ if( (decimal_point != trimmed[i] ) && !LLStringOps::isDigit( trimmed[i] ) )
+ {
+ success = FALSE;
+ break;
+ }
+ }
+ }
+
+ return success;
+ }
+
+ // Limits what characters can be used to [1234567890-] with [-] only valid in the first position.
+ // Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for
+ // the simple reasons that intermediate states may be invalid even if the final result is valid.
+ //
+ bool validateInt(const LLWString &str)
+ {
+ LLLocale locale(LLLocale::USER_LOCALE);
+
+ bool success = TRUE;
+ LLWString trimmed = str;
+ LLWStringUtil::trim(trimmed);
+ S32 len = trimmed.length();
+ if( 0 < len )
+ {
+ S32 i = 0;
+
+ // First character can be a negative sign
+ if( '-' == trimmed[0] )
+ {
+ i++;
+ }
+
+ for( ; i < len; i++ )
+ {
+ if( !LLStringOps::isDigit( trimmed[i] ) )
+ {
+ success = FALSE;
+ break;
+ }
+ }
+ }
+
+ return success;
+ }
+
+ bool validatePositiveS32(const LLWString &str)
+ {
+ LLLocale locale(LLLocale::USER_LOCALE);
+
+ LLWString trimmed = str;
+ LLWStringUtil::trim(trimmed);
+ S32 len = trimmed.length();
+ bool success = TRUE;
+ if(0 < len)
+ {
+ if(('-' == trimmed[0]) || ('0' == trimmed[0]))
+ {
+ success = FALSE;
+ }
+ S32 i = 0;
+ while(success && (i < len))
+ {
+ if(!LLStringOps::isDigit(trimmed[i++]))
+ {
+ success = FALSE;
+ }
+ }
+ }
+ if (success)
+ {
+ S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10);
+ if (val <= 0)
+ {
+ success = FALSE;
+ }
+ }
+ return success;
+ }
+
+ bool validateNonNegativeS32(const LLWString &str)
+ {
+ LLLocale locale(LLLocale::USER_LOCALE);
+
+ LLWString trimmed = str;
+ LLWStringUtil::trim(trimmed);
+ S32 len = trimmed.length();
+ bool success = TRUE;
+ if(0 < len)
+ {
+ if('-' == trimmed[0])
+ {
+ success = FALSE;
+ }
+ S32 i = 0;
+ while(success && (i < len))
+ {
+ if(!LLStringOps::isDigit(trimmed[i++]))
+ {
+ success = FALSE;
+ }
+ }
+ }
+ if (success)
+ {
+ S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10);
+ if (val < 0)
+ {
+ success = FALSE;
+ }
+ }
+ return success;
+ }
+
+ bool validateAlphaNum(const LLWString &str)
+ {
+ LLLocale locale(LLLocale::USER_LOCALE);
+
+ bool rv = TRUE;
+ S32 len = str.length();
+ if(len == 0) return rv;
+ while(len--)
+ {
+ if( !LLStringOps::isAlnum((char)str[len]) )
+ {
+ rv = FALSE;
+ break;
+ }
+ }
+ return rv;
+ }
+
+ bool validateAlphaNumSpace(const LLWString &str)
+ {
+ LLLocale locale(LLLocale::USER_LOCALE);
+
+ bool rv = TRUE;
+ S32 len = str.length();
+ if(len == 0) return rv;
+ while(len--)
+ {
+ if(!(LLStringOps::isAlnum((char)str[len]) || (' ' == str[len])))
+ {
+ rv = FALSE;
+ break;
+ }
+ }
+ return rv;
+ }
+
+ // Used for most names of things stored on the server, due to old file-formats
+ // that used the pipe (|) for multiline text storage. Examples include
+ // inventory item names, parcel names, object names, etc.
+ bool validateASCIIPrintableNoPipe(const LLWString &str)
+ {
+ bool rv = TRUE;
+ S32 len = str.length();
+ if(len == 0) return rv;
+ while(len--)
+ {
+ llwchar wc = str[len];
+ if (wc < 0x20
+ || wc > 0x7f
+ || wc == '|')
+ {
+ rv = FALSE;
+ break;
+ }
+ if(!(wc == ' '
+ || LLStringOps::isAlnum((char)wc)
+ || LLStringOps::isPunct((char)wc) ) )
+ {
+ rv = FALSE;
+ break;
+ }
+ }
+ return rv;
+ }
+
+
+ // Used for avatar names
+ bool validateASCIIPrintableNoSpace(const LLWString &str)
+ {
+ bool rv = TRUE;
+ S32 len = str.length();
+ if(len == 0) return rv;
+ while(len--)
+ {
+ llwchar wc = str[len];
+ if (wc < 0x20
+ || wc > 0x7f
+ || LLStringOps::isSpace(wc))
+ {
+ rv = FALSE;
+ break;
+ }
+ if( !(LLStringOps::isAlnum((char)str[len]) ||
+ LLStringOps::isPunct((char)str[len]) ) )
+ {
+ rv = FALSE;
+ break;
+ }
+ }
+ return rv;
+ }
+
+ bool validateASCII(const LLWString &str)
+ {
+ bool rv = TRUE;
+ S32 len = str.length();
+ while(len--)
+ {
+ if (str[len] < 0x20 || str[len] > 0x7f)
+ {
+ rv = FALSE;
+ break;
+ }
+ }
+ return rv;
+ }
+}
diff --git a/indra/llui/lltextvalidate.h b/indra/llui/lltextvalidate.h
new file mode 100644
index 0000000000..ffb4e85e7c
--- /dev/null
+++ b/indra/llui/lltextvalidate.h
@@ -0,0 +1,63 @@
+/**
+ * @file lltextbase.h
+ * @author Martin Reddy
+ * @brief The base class of text box/editor, providing Url handling support
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLTEXTVALIDATE_H
+#define LL_LLTEXTVALIDATE_H
+
+#include "llstring.h"
+#include "llinitparam.h"
+#include <boost/function.hpp>
+
+namespace LLTextValidate
+{
+ typedef boost::function<BOOL (const LLWString &wstr)> validate_func_t;
+
+ struct ValidateTextNamedFuncs
+ : public LLInitParam::TypeValuesHelper<validate_func_t, ValidateTextNamedFuncs>
+ {
+ static void declareValues();
+ };
+
+ bool validateFloat(const LLWString &str );
+ bool validateInt(const LLWString &str );
+ bool validatePositiveS32(const LLWString &str);
+ bool validateNonNegativeS32(const LLWString &str);
+ bool validateAlphaNum(const LLWString &str );
+ bool validateAlphaNumSpace(const LLWString &str );
+ bool validateASCIIPrintableNoPipe(const LLWString &str);
+ bool validateASCIIPrintableNoSpace(const LLWString &str);
+ bool validateASCII(const LLWString &str);
+}
+
+
+#endif
diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h
index 7978b6a583..c0811c56c3 100644
--- a/indra/llui/lltooltip.h
+++ b/indra/llui/lltooltip.h
@@ -129,7 +129,8 @@ private:
class LLInspector : public LLToolTip
{
public:
- struct Params : public LLInitParam::Block<Params, LLToolTip::Params> {};
+ struct Params : public LLInitParam::Block<Params, LLToolTip::Params>
+ {};
};
class LLToolTipMgr : public LLSingleton<LLToolTipMgr>
diff --git a/indra/llui/lluicolortable.cpp b/indra/llui/lluicolortable.cpp
index 9be33483d0..1b64ef3abe 100644
--- a/indra/llui/lluicolortable.cpp
+++ b/indra/llui/lluicolortable.cpp
@@ -56,7 +56,7 @@ LLUIColorTable::Params::Params()
{
}
-void LLUIColorTable::insertFromParams(const Params& p)
+void LLUIColorTable::insertFromParams(const Params& p, string_color_map_t& table)
{
// this map will contain all color references after the following loop
typedef std::map<std::string, std::string> string_string_map_t;
@@ -69,14 +69,7 @@ void LLUIColorTable::insertFromParams(const Params& p)
ColorEntryParams color_entry = *it;
if(color_entry.color.value.isChosen())
{
- if(mUserSetColors.find(color_entry.name)!=mUserSetColors.end())
- {
- setColor(color_entry.name, color_entry.color.value);
- }
- else
- {
- setColor(color_entry.name, color_entry.color.value, mLoadedColors);
- }
+ setColor(color_entry.name, color_entry.color.value, table);
}
else
{
@@ -220,16 +213,16 @@ bool LLUIColorTable::loadFromSettings()
bool result = false;
std::string default_filename = gDirUtilp->getExpandedFilename(LL_PATH_DEFAULT_SKIN, "colors.xml");
- result |= loadFromFilename(default_filename);
+ result |= loadFromFilename(default_filename, mLoadedColors);
std::string current_filename = gDirUtilp->getExpandedFilename(LL_PATH_TOP_SKIN, "colors.xml");
if(current_filename != default_filename)
{
- result |= loadFromFilename(current_filename);
+ result |= loadFromFilename(current_filename, mLoadedColors);
}
std::string user_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "colors.xml");
- loadFromFilename(user_filename);
+ loadFromFilename(user_filename, mUserSetColors);
return result;
}
@@ -299,7 +292,7 @@ void LLUIColorTable::setColor(const std::string& name, const LLColor4& color, st
}
}
-bool LLUIColorTable::loadFromFilename(const std::string& filename)
+bool LLUIColorTable::loadFromFilename(const std::string& filename, string_color_map_t& table)
{
LLXMLNodePtr root;
@@ -320,7 +313,7 @@ bool LLUIColorTable::loadFromFilename(const std::string& filename)
if(params.validateBlock())
{
- insertFromParams(params);
+ insertFromParams(params, table);
}
else
{
@@ -330,3 +323,11 @@ bool LLUIColorTable::loadFromFilename(const std::string& filename)
return true;
}
+
+void LLUIColorTable::insertFromParams(const Params& p)
+{
+ insertFromParams(p, mUserSetColors);
+}
+
+// EOF
+
diff --git a/indra/llui/lluicolortable.h b/indra/llui/lluicolortable.h
index c87695f456..d401e5e724 100644
--- a/indra/llui/lluicolortable.h
+++ b/indra/llui/lluicolortable.h
@@ -45,6 +45,10 @@ class LLUIColor;
class LLUIColorTable : public LLSingleton<LLUIColorTable>
{
LOG_CLASS(LLUIColorTable);
+
+ // consider using sorted vector, can be much faster
+ typedef std::map<std::string, LLUIColor> string_color_map_t;
+
public:
struct ColorParams : LLInitParam::Choice<ColorParams>
{
@@ -91,10 +95,9 @@ public:
void saveUserSettings() const;
private:
- bool loadFromFilename(const std::string& filename);
+ bool loadFromFilename(const std::string& filename, string_color_map_t& table);
- // consider using sorted vector, can be much faster
- typedef std::map<std::string, LLUIColor> string_color_map_t;
+ void insertFromParams(const Params& p, string_color_map_t& table);
void clearTable(string_color_map_t& table);
void setColor(const std::string& name, const LLColor4& color, string_color_map_t& table);
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index f1b08c380b..63e627ceb5 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -1720,6 +1720,7 @@ LLView* LLView::findChildView(const std::string& name, BOOL recurse) const
for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
{
LLView* childp = *child_it;
+ llassert(childp);
if (childp->getName() == name)
{
return childp;
@@ -1731,6 +1732,7 @@ LLView* LLView::findChildView(const std::string& name, BOOL recurse) const
for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
{
LLView* childp = *child_it;
+ llassert(childp);
LLView* viewp = childp->findChildView(name, recurse);
if ( viewp )
{
diff --git a/indra/llvfs/llvfile.cpp b/indra/llvfs/llvfile.cpp
index 5fdf41188d..e0e282d7af 100644
--- a/indra/llvfs/llvfile.cpp
+++ b/indra/llvfs/llvfile.cpp
@@ -428,7 +428,7 @@ bool LLVFile::isLocked(EVFSLock lock)
void LLVFile::waitForLock(EVFSLock lock)
{
- LLFastTimer t(FTM_VFILE_WAIT);
+ //LLFastTimer t(FTM_VFILE_WAIT);
// spin until the lock clears
while (isLocked(lock))
{
diff --git a/indra/llvfs/llvfs.cpp b/indra/llvfs/llvfs.cpp
index 9ce1e75d06..ddb76fb2ba 100644
--- a/indra/llvfs/llvfs.cpp
+++ b/indra/llvfs/llvfs.cpp
@@ -2041,6 +2041,9 @@ std::string get_extension(LLAssetType::EType type)
case LLAssetType::AT_ANIMATION:
extension = ".lla";
break;
+ case LLAssetType::AT_MESH:
+ extension = ".slm";
+ break;
default:
// Just use the asset server filename extension in most cases
extension += ".";
diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt
index 77c6fa57b6..bf3233f386 100644
--- a/indra/llwindow/CMakeLists.txt
+++ b/indra/llwindow/CMakeLists.txt
@@ -113,6 +113,7 @@ if (WINDOWS)
)
list(APPEND llwindow_LINK_LIBRARIES
comdlg32 # Common Dialogs for ChooseColor
+ ole32
)
endif (WINDOWS)
diff --git a/indra/llwindow/lldragdropwin32.cpp b/indra/llwindow/lldragdropwin32.cpp
index 9b80fe0a84..b85960be10 100644
--- a/indra/llwindow/lldragdropwin32.cpp
+++ b/indra/llwindow/lldragdropwin32.cpp
@@ -50,7 +50,8 @@ class LLDragDropWin32Target:
LLDragDropWin32Target( HWND hWnd ) :
mRefCount( 1 ),
mAppWindowHandle( hWnd ),
- mAllowDrop( false)
+ mAllowDrop(false),
+ mIsSlurl(false)
{
};
diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h
index 127dbf45e0..55b221e716 100644
--- a/indra/llwindow/llwindow.h
+++ b/indra/llwindow/llwindow.h
@@ -37,6 +37,7 @@
#include "llcoord.h"
#include "llstring.h"
#include "llcursortypes.h"
+#include "llsd.h"
class LLSplashScreen;
class LLPreeditor;
@@ -162,6 +163,9 @@ public:
virtual void spawnWebBrowser(const std::string& escaped_url) {};
static std::vector<std::string> getDynamicFallbackFontList();
+
+ // Provide native key event data
+ virtual LLSD getNativeKeyData() { return LLSD::emptyMap(); }
protected:
LLWindow(LLWindowCallbacks* callbacks, BOOL fullscreen, U32 flags);
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index 9ccd4c7f97..ad97bc45fc 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -260,6 +260,7 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,
mTSMScriptCode = 0;
mTSMLangCode = 0;
mPreeditor = NULL;
+ mRawKeyEvent = NULL;
mFSAASamples = fsaa_samples;
mForceRebuild = FALSE;
@@ -2140,10 +2141,11 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
{
UInt32 modifiers = 0;
+
// First, process the raw event.
{
- EventRef rawEvent;
-
+ EventRef rawEvent = NULL;
+
// Get the original event and extract the modifier keys, so we can ignore command-key events.
if (GetEventParameter(event, kEventParamTextInputSendKeyboardEvent, typeEventRef, NULL, sizeof(rawEvent), NULL, &rawEvent) == noErr)
{
@@ -2152,6 +2154,9 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
// and call this function recursively to handle the raw key event.
eventHandler (myHandler, rawEvent);
+
+ // save the raw event until we're done processing the unicode input as well.
+ mRawKeyEvent = rawEvent;
}
}
@@ -2202,6 +2207,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
delete[] buffer;
}
+ mRawKeyEvent = NULL;
result = err;
}
break;
@@ -2276,6 +2282,9 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
GetEventParameter (event, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &keyCode);
GetEventParameter (event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers);
+ // save the raw event so getNativeKeyData can use it.
+ mRawKeyEvent = event;
+
// printf("key event, key code = 0x%08x, char code = 0x%02x (%c), modifiers = 0x%08x\n", keyCode, charCode, (char)charCode, modifiers);
// fflush(stdout);
@@ -2371,6 +2380,8 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
result = eventNotHandledErr;
break;
}
+
+ mRawKeyEvent = NULL;
}
break;
@@ -3211,6 +3222,60 @@ void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url)
}
}
+LLSD LLWindowMacOSX::getNativeKeyData()
+{
+ LLSD result = LLSD::emptyMap();
+
+ if(mRawKeyEvent)
+ {
+ char char_code = 0;
+ UInt32 key_code = 0;
+ UInt32 modifiers = 0;
+ UInt32 keyboard_type = 0;
+
+ GetEventParameter (mRawKeyEvent, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &char_code);
+ GetEventParameter (mRawKeyEvent, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &key_code);
+ GetEventParameter (mRawKeyEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers);
+ GetEventParameter (mRawKeyEvent, kEventParamKeyboardType, typeUInt32, NULL, sizeof(UInt32), NULL, &keyboard_type);
+
+ result["char_code"] = (S32)char_code;
+ result["key_code"] = (S32)key_code;
+ result["modifiers"] = (S32)modifiers;
+ result["keyboard_type"] = (S32)keyboard_type;
+
+#if 0
+ // This causes trouble for control characters -- apparently character codes less than 32 (escape, control-A, etc)
+ // cause llsd serialization to create XML that the llsd deserializer won't parse!
+ std::string unicode;
+ OSStatus err = noErr;
+ EventParamType actualType = typeUTF8Text;
+ UInt32 actualSize = 0;
+ char *buffer = NULL;
+
+ err = GetEventParameter (mRawKeyEvent, kEventParamKeyUnicodes, typeUTF8Text, &actualType, 0, &actualSize, NULL);
+ if(err == noErr)
+ {
+ // allocate a buffer and get the actual data.
+ buffer = new char[actualSize];
+ err = GetEventParameter (mRawKeyEvent, kEventParamKeyUnicodes, typeUTF8Text, &actualType, actualSize, &actualSize, buffer);
+ if(err == noErr)
+ {
+ unicode.assign(buffer, actualSize);
+ }
+ delete[] buffer;
+ }
+
+ result["unicode"] = unicode;
+#endif
+
+ }
+
+
+ lldebugs << "native key data is: " << result << llendl;
+
+ return result;
+}
+
BOOL LLWindowMacOSX::dialogColorPicker( F32 *r, F32 *g, F32 *b)
{
diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h
index 377f10b6d4..7c6b324029 100644
--- a/indra/llwindow/llwindowmacosx.h
+++ b/indra/llwindow/llwindowmacosx.h
@@ -120,6 +120,10 @@ public:
static std::vector<std::string> getDynamicFallbackFontList();
+ // Provide native key event data
+ /*virtual*/ LLSD getNativeKeyData();
+
+
protected:
LLWindowMacOSX(LLWindowCallbacks* callbacks,
const std::string& title, const std::string& name, int x, int y, int width, int height, U32 flags,
@@ -218,6 +222,7 @@ protected:
friend class LLWindowManager;
static WindowRef sMediaWindow;
+ EventRef mRawKeyEvent;
};
diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp
index bfdf1147a1..7cd06c9c37 100644
--- a/indra/llwindow/llwindowsdl.cpp
+++ b/indra/llwindow/llwindowsdl.cpp
@@ -251,6 +251,10 @@ LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks,
#if LL_X11
mFlashing = FALSE;
#endif // LL_X11
+
+ mKeyScanCode = 0;
+ mKeyVirtualKey = 0;
+ mKeyModifiers = KMOD_NONE;
}
static SDL_Surface *Load_BMP_Resource(const char *basename)
@@ -1617,7 +1621,7 @@ void LLWindowSDL::processMiscNativeEvents()
pump_timer.setTimerExpirySec(1.0f / 15.0f);
do {
// Always do at least one non-blocking pump
- gtk_main_iteration_do(0);
+ gtk_main_iteration_do(FALSE);
} while (gtk_events_pending() &&
!pump_timer.hasExpired());
@@ -1651,24 +1655,32 @@ void LLWindowSDL::gatherInput()
}
case SDL_KEYDOWN:
- gKeyboard->handleKeyDown(event.key.keysym.sym, event.key.keysym.mod);
- // part of the fix for SL-13243
- if (SDLCheckGrabbyKeys(event.key.keysym.sym, TRUE) != 0)
- SDLReallyCaptureInput(TRUE);
-
- if (event.key.keysym.unicode)
- {
- handleUnicodeUTF16(event.key.keysym.unicode,
- gKeyboard->currentMask(FALSE));
- }
+ mKeyScanCode = event.key.keysym.scancode;
+ mKeyVirtualKey = event.key.keysym.unicode;
+ mKeyModifiers = event.key.keysym.mod;
+
+ gKeyboard->handleKeyDown(event.key.keysym.sym, event.key.keysym.mod);
+ // part of the fix for SL-13243
+ if (SDLCheckGrabbyKeys(event.key.keysym.sym, TRUE) != 0)
+ SDLReallyCaptureInput(TRUE);
+
+ if (event.key.keysym.unicode)
+ {
+ handleUnicodeUTF16(event.key.keysym.unicode,
+ gKeyboard->currentMask(FALSE));
+ }
break;
case SDL_KEYUP:
- if (SDLCheckGrabbyKeys(event.key.keysym.sym, FALSE) == 0)
- SDLReallyCaptureInput(FALSE); // part of the fix for SL-13243
+ mKeyScanCode = event.key.keysym.scancode;
+ mKeyVirtualKey = event.key.keysym.unicode;
+ mKeyModifiers = event.key.keysym.mod;
- gKeyboard->handleKeyUp(event.key.keysym.sym, event.key.keysym.mod);
- break;
+ if (SDLCheckGrabbyKeys(event.key.keysym.sym, FALSE) == 0)
+ SDLReallyCaptureInput(FALSE); // part of the fix for SL-13243
+
+ gKeyboard->handleKeyUp(event.key.keysym.sym, event.key.keysym.mod);
+ break;
case SDL_MOUSEBUTTONDOWN:
{
@@ -2224,6 +2236,39 @@ static void color_changed_callback(GtkWidget *widget,
gtk_color_selection_get_current_color(colorsel, colorp);
}
+
+/*
+ Make the raw keyboard data available - used to poke through to LLQtWebKit so
+ that Qt/Webkit has access to the virtual keycodes etc. that it needs
+*/
+LLSD LLWindowSDL::getNativeKeyData()
+{
+ LLSD result = LLSD::emptyMap();
+
+ U32 modifiers = 0; // pretend-native modifiers... oh what a tangled web we weave!
+
+ // we go through so many levels of device abstraction that I can't really guess
+ // what a plugin under GDK under Qt under SL under SDL under X11 considers
+ // a 'native' modifier mask. this has been sort of reverse-engineered... they *appear*
+ // to match GDK consts, but that may be co-incidence.
+ modifiers |= (mKeyModifiers & KMOD_LSHIFT) ? 0x0001 : 0;
+ modifiers |= (mKeyModifiers & KMOD_RSHIFT) ? 0x0001 : 0;// munge these into the same shift
+ modifiers |= (mKeyModifiers & KMOD_CAPS) ? 0x0002 : 0;
+ modifiers |= (mKeyModifiers & KMOD_LCTRL) ? 0x0004 : 0;
+ modifiers |= (mKeyModifiers & KMOD_RCTRL) ? 0x0004 : 0;// munge these into the same ctrl
+ modifiers |= (mKeyModifiers & KMOD_LALT) ? 0x0008 : 0;// untested
+ modifiers |= (mKeyModifiers & KMOD_RALT) ? 0x0008 : 0;// untested
+ // *todo: test ALTs - I don't have a case for testing these. Do you?
+ // *todo: NUM? - I don't care enough right now (and it's not a GDK modifier).
+
+ result["scan_code"] = (S32)mKeyScanCode;
+ result["virtual_key"] = (S32)mKeyVirtualKey;
+ result["modifiers"] = (S32)modifiers;
+
+ return result;
+}
+
+
BOOL LLWindowSDL::dialogColorPicker( F32 *r, F32 *g, F32 *b)
{
BOOL rtn = FALSE;
diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h
index 0ba1c861da..e6bdd46a77 100644
--- a/indra/llwindow/llwindowsdl.h
+++ b/indra/llwindow/llwindowsdl.h
@@ -102,7 +102,7 @@ public:
/*virtual*/ void gatherInput();
/*virtual*/ void swapBuffers();
- /*virtual*/ void delayInputProcessing() { };
+ /*virtual*/ void delayInputProcessing() { };
// handy coordinate space conversion routines
/*virtual*/ BOOL convertCoords(LLCoordScreen from, LLCoordWindow *to);
@@ -155,12 +155,13 @@ protected:
BOOL ignore_pixel_depth, U32 fsaa_samples);
~LLWindowSDL();
+ /*virtual*/ BOOL isValid();
+ /*virtual*/ LLSD getNativeKeyData();
+
void initCursors();
void quitCursors();
- BOOL isValid();
void moveWindow(const LLCoordScreen& position,const LLCoordScreen& size);
-
// Changes display resolution. Returns true if successful
BOOL setDisplayResolution(S32 width, S32 height, S32 bits, S32 refresh);
@@ -204,12 +205,16 @@ protected:
friend class LLWindowManager;
-#if LL_X11
private:
+#if LL_X11
void x11_set_urgent(BOOL urgent);
BOOL mFlashing;
LLTimer mFlashTimer;
#endif //LL_X11
+
+ U32 mKeyScanCode;
+ U32 mKeyVirtualKey;
+ SDLMod mKeyModifiers;
};
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 57a4921d92..c80392ad45 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -378,6 +378,9 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
mMousePositionModified = FALSE;
mInputProcessingPaused = FALSE;
mPreeditor = NULL;
+ mKeyCharCode = 0;
+ mKeyScanCode = 0;
+ mKeyVirtualKey = 0;
mhDC = NULL;
mhRC = NULL;
@@ -1872,6 +1875,10 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
// allow system keys, such as ALT-F4 to be processed by Windows
eat_keystroke = FALSE;
case WM_KEYDOWN:
+ window_imp->mKeyCharCode = 0; // don't know until wm_char comes in next
+ window_imp->mKeyScanCode = ( l_param >> 16 ) & 0xff;
+ window_imp->mKeyVirtualKey = w_param;
+
window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_KEYDOWN");
{
if (gDebugWindowProc)
@@ -1891,6 +1898,9 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
eat_keystroke = FALSE;
case WM_KEYUP:
{
+ window_imp->mKeyScanCode = ( l_param >> 16 ) & 0xff;
+ window_imp->mKeyVirtualKey = w_param;
+
window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_KEYUP");
LLFastTimer t2(FTM_KEYHANDLER);
@@ -1976,6 +1986,8 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
break;
case WM_CHAR:
+ window_imp->mKeyCharCode = w_param;
+
// Should really use WM_UNICHAR eventually, but it requires a specific Windows version and I need
// to figure out how that works. - Doug
//
@@ -3051,6 +3063,19 @@ void LLWindowWin32::spawnWebBrowser(const std::string& escaped_url )
*/
}
+/*
+ Make the raw keyboard data available - used to poke through to LLQtWebKit so
+ that Qt/Webkit has access to the virtual keycodes etc. that it needs
+*/
+LLSD LLWindowWin32::getNativeKeyData()
+{
+ LLSD result = LLSD::emptyMap();
+
+ result["scan_code"] = (S32)mKeyScanCode;
+ result["virtual_key"] = (S32)mKeyVirtualKey;
+
+ return result;
+}
BOOL LLWindowWin32::dialogColorPicker( F32 *r, F32 *g, F32 *b )
{
diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h
index 6aca31b63e..9d57735772 100644
--- a/indra/llwindow/llwindowwin32.h
+++ b/indra/llwindow/llwindowwin32.h
@@ -132,7 +132,7 @@ protected:
HCURSOR loadColorCursor(LPCTSTR name);
BOOL isValid();
void moveWindow(const LLCoordScreen& position,const LLCoordScreen& size);
-
+ LLSD getNativeKeyData();
// Changes display resolution. Returns true if successful
BOOL setDisplayResolution(S32 width, S32 height, S32 bits, S32 refresh);
@@ -211,6 +211,10 @@ protected:
LLDragDropWin32* mDragDrop;
+ U32 mKeyCharCode;
+ U32 mKeyScanCode;
+ U32 mKeyVirtualKey;
+
friend class LLWindowManager;
};
diff --git a/indra/lscript/lscript_compile/lscript_tree.cpp b/indra/lscript/lscript_compile/lscript_tree.cpp
index 3b8bbbe805..4ba41db2fc 100644
--- a/indra/lscript/lscript_compile/lscript_tree.cpp
+++ b/indra/lscript/lscript_compile/lscript_tree.cpp
@@ -10626,6 +10626,8 @@ LLScriptScript::LLScriptScript(LLScritpGlobalStorage *globals,
}
temp = temp->mNextp;
}
+
+ mClassName[0] = '\0';
}
void LLScriptScript::setBytecodeDest(const char* dst_filename)
diff --git a/indra/lscript/lscript_compile/lscript_tree.h b/indra/lscript/lscript_compile/lscript_tree.h
index a667e1eb5b..7de9606dfc 100644
--- a/indra/lscript/lscript_compile/lscript_tree.h
+++ b/indra/lscript/lscript_compile/lscript_tree.h
@@ -1876,7 +1876,7 @@ class LLScriptStateChange : public LLScriptStatement
{
public:
LLScriptStateChange(S32 line, S32 col, LLScriptIdentifier *identifier)
- : LLScriptStatement(line, col, LSSMT_STATE_CHANGE), mIdentifier(identifier)
+ : LLScriptStatement(line, col, LSSMT_STATE_CHANGE), mIdentifier(identifier), mReturnType(LST_NULL)
{
}
@@ -2210,7 +2210,7 @@ class LLScriptState : public LLScriptFilePosition
{
public:
LLScriptState(S32 line, S32 col, LSCRIPTStateType type, LLScriptIdentifier *identifier, LLScriptEventHandler *event)
- : LLScriptFilePosition(line, col), mType(type), mIdentifier(identifier), mEvent(event), mNextp(NULL)
+ : LLScriptFilePosition(line, col), mType(type), mIdentifier(identifier), mEvent(event), mNextp(NULL), mStateScope(NULL)
{
}
diff --git a/indra/media_plugins/webkit/CMakeLists.txt b/indra/media_plugins/webkit/CMakeLists.txt
index 5bccd589d8..4512c22b5d 100644
--- a/indra/media_plugins/webkit/CMakeLists.txt
+++ b/indra/media_plugins/webkit/CMakeLists.txt
@@ -9,6 +9,7 @@ include(LLPlugin)
include(LLMath)
include(LLRender)
include(LLWindow)
+include(UI)
include(Linking)
include(PluginAPI)
include(MediaPluginBase)
@@ -38,7 +39,7 @@ add_library(media_plugin_webkit
${media_plugin_webkit_SOURCE_FILES}
)
-target_link_libraries(media_plugin_webkit
+set(media_plugin_webkit_LINK_LIBRARIES
${LLPLUGIN_LIBRARIES}
${MEDIA_PLUGIN_BASE_LIBRARIES}
${LLCOMMON_LIBRARIES}
@@ -46,6 +47,14 @@ target_link_libraries(media_plugin_webkit
${PLUGIN_API_WINDOWS_LIBRARIES}
)
+if (LINUX)
+ list(APPEND media_plugin_webkit_LINK_LIBRARIES
+ ${UI_LIBRARIES} # for glib/GTK
+ )
+endif (LINUX)
+
+target_link_libraries(media_plugin_webkit ${media_plugin_webkit_LINK_LIBRARIES})
+
add_dependencies(media_plugin_webkit
${LLPLUGIN_LIBRARIES}
${MEDIA_PLUGIN_BASE_LIBRARIES}
@@ -79,4 +88,5 @@ if (DARWIN)
DEPENDS media_plugin_webkit ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib
)
-endif (DARWIN) \ No newline at end of file
+endif (DARWIN)
+
diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
index 3c24b4ed22..688d3bcd3d 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -470,92 +470,96 @@ private:
return (LLQtWebKit::EKeyboardModifier)result;
}
-
////////////////////////////////////////////////////////////////////////////////
//
- void keyEvent(LLQtWebKit::EKeyEvent key_event, int key, LLQtWebKit::EKeyboardModifier modifiers)
+ void deserializeKeyboardData( LLSD native_key_data, uint32_t& native_scan_code, uint32_t& native_virtual_key, uint32_t& native_modifiers )
{
- int llqt_key;
+ native_scan_code = 0;
+ native_virtual_key = 0;
+ native_modifiers = 0;
+ if( native_key_data.isMap() )
+ {
+#if LL_DARWIN
+ native_scan_code = (uint32_t)(native_key_data["char_code"].asInteger());
+ native_virtual_key = (uint32_t)(native_key_data["key_code"].asInteger());
+ native_modifiers = (uint32_t)(native_key_data["modifiers"].asInteger());
+#elif LL_WINDOWS
+ native_scan_code = (uint32_t)(native_key_data["scan_code"].asInteger());
+ native_virtual_key = (uint32_t)(native_key_data["virtual_key"].asInteger());
+ // TODO: I don't think we need to do anything with native modifiers here -- please verify
+#elif LL_LINUX
+ native_scan_code = (uint32_t)(native_key_data["scan_code"].asInteger());
+ native_virtual_key = (uint32_t)(native_key_data["virtual_key"].asInteger());
+ native_modifiers = (uint32_t)(native_key_data["modifiers"].asInteger());
+#else
+ // Add other platforms here as needed
+#endif
+ };
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ void keyEvent(LLQtWebKit::EKeyEvent key_event, int key, LLQtWebKit::EKeyboardModifier modifiers, LLSD native_key_data = LLSD::emptyMap())
+ {
// The incoming values for 'key' will be the ones from indra_constants.h
- // the outgoing values are the ones from llqtwebkit.h
+ std::string utf8_text;
+
+ if(key < KEY_SPECIAL)
+ {
+ // Low-ascii characters need to get passed through.
+ utf8_text = (char)key;
+ }
+ // Any special-case handling we want to do for particular keys...
switch((KEY)key)
{
- // This is the list that the llqtwebkit implementation actually maps into Qt keys.
-// case KEY_XXX: llqt_key = LL_DOM_VK_CANCEL; break;
-// case KEY_XXX: llqt_key = LL_DOM_VK_HELP; break;
- case KEY_BACKSPACE: llqt_key = LL_DOM_VK_BACK_SPACE; break;
- case KEY_TAB: llqt_key = LL_DOM_VK_TAB; break;
-// case KEY_XXX: llqt_key = LL_DOM_VK_CLEAR; break;
- case KEY_RETURN: llqt_key = LL_DOM_VK_RETURN; break;
- case KEY_PAD_RETURN: llqt_key = LL_DOM_VK_ENTER; break;
- case KEY_SHIFT: llqt_key = LL_DOM_VK_SHIFT; break;
- case KEY_CONTROL: llqt_key = LL_DOM_VK_CONTROL; break;
- case KEY_ALT: llqt_key = LL_DOM_VK_ALT; break;
-// case KEY_XXX: llqt_key = LL_DOM_VK_PAUSE; break;
- case KEY_CAPSLOCK: llqt_key = LL_DOM_VK_CAPS_LOCK; break;
- case KEY_ESCAPE: llqt_key = LL_DOM_VK_ESCAPE; break;
- case KEY_PAGE_UP: llqt_key = LL_DOM_VK_PAGE_UP; break;
- case KEY_PAGE_DOWN: llqt_key = LL_DOM_VK_PAGE_DOWN; break;
- case KEY_END: llqt_key = LL_DOM_VK_END; break;
- case KEY_HOME: llqt_key = LL_DOM_VK_HOME; break;
- case KEY_LEFT: llqt_key = LL_DOM_VK_LEFT; break;
- case KEY_UP: llqt_key = LL_DOM_VK_UP; break;
- case KEY_RIGHT: llqt_key = LL_DOM_VK_RIGHT; break;
- case KEY_DOWN: llqt_key = LL_DOM_VK_DOWN; break;
-// case KEY_XXX: llqt_key = LL_DOM_VK_PRINTSCREEN; break;
- case KEY_INSERT: llqt_key = LL_DOM_VK_INSERT; break;
- case KEY_DELETE: llqt_key = LL_DOM_VK_DELETE; break;
-// case KEY_XXX: llqt_key = LL_DOM_VK_CONTEXT_MENU; break;
+ // ASCII codes for some standard keys
+ case LLQtWebKit::KEY_BACKSPACE: utf8_text = (char)8; break;
+ case LLQtWebKit::KEY_TAB: utf8_text = (char)9; break;
+ case LLQtWebKit::KEY_RETURN: utf8_text = (char)13; break;
+ case LLQtWebKit::KEY_PAD_RETURN: utf8_text = (char)13; break;
+ case LLQtWebKit::KEY_ESCAPE: utf8_text = (char)27; break;
- default:
- if(key < KEY_SPECIAL)
- {
- // Pass the incoming key through -- it should be regular ASCII, which should be correct for webkit.
- llqt_key = key;
- }
- else
- {
- // Don't pass through untranslated special keys -- they'll be all wrong.
- llqt_key = 0;
- }
+ default:
break;
}
-// std::cerr << "keypress, original code = 0x" << std::hex << key << ", converted code = 0x" << std::hex << llqt_key << std::dec << std::endl;
+// std::cerr << "key event " << (int)key_event << ", native_key_data = " << native_key_data << std::endl;
- if(llqt_key != 0)
- {
- LLQtWebKit::getInstance()->keyEvent( mBrowserWindowId, key_event, llqt_key, modifiers);
- }
+ uint32_t native_scan_code = 0;
+ uint32_t native_virtual_key = 0;
+ uint32_t native_modifiers = 0;
+ deserializeKeyboardData( native_key_data, native_scan_code, native_virtual_key, native_modifiers );
+
+ LLQtWebKit::getInstance()->keyboardEvent( mBrowserWindowId, key_event, (uint32_t)key, utf8_text.c_str(), modifiers, native_scan_code, native_virtual_key, native_modifiers);
checkEditState();
};
////////////////////////////////////////////////////////////////////////////////
//
- void unicodeInput( const std::string &utf8str, LLQtWebKit::EKeyboardModifier modifiers)
- {
- LLWString wstr = utf8str_to_wstring(utf8str);
+ void unicodeInput( const std::string &utf8str, LLQtWebKit::EKeyboardModifier modifiers, LLSD native_key_data = LLSD::emptyMap())
+ {
+ uint32_t key = LLQtWebKit::KEY_NONE;
+
+// std::cerr << "unicode input, native_key_data = " << native_key_data << std::endl;
- unsigned int i;
- for(i=0; i < wstr.size(); i++)
+ if(utf8str.size() == 1)
{
-// std::cerr << "unicode input, code = 0x" << std::hex << (unsigned long)(wstr[i]) << std::dec << std::endl;
-
- if(wstr[i] == 32)
- {
- // For some reason, the webkit plugin really wants the space bar to come in through the key-event path, not the unicode path.
- LLQtWebKit::getInstance()->keyEvent( mBrowserWindowId, LLQtWebKit::KE_KEY_DOWN, 32, modifiers);
- LLQtWebKit::getInstance()->keyEvent( mBrowserWindowId, LLQtWebKit::KE_KEY_UP, 32, modifiers);
- }
- else
- {
- LLQtWebKit::getInstance()->unicodeInput(mBrowserWindowId, wstr[i], modifiers);
- }
+ // The only way a utf8 string can be one byte long is if it's actually a single 7-bit ascii character.
+ // In this case, use it as the key value.
+ key = utf8str[0];
}
+ uint32_t native_scan_code = 0;
+ uint32_t native_virtual_key = 0;
+ uint32_t native_modifiers = 0;
+ deserializeKeyboardData( native_key_data, native_scan_code, native_virtual_key, native_modifiers );
+
+ LLQtWebKit::getInstance()->keyboardEvent( mBrowserWindowId, LLQtWebKit::KE_KEY_DOWN, (uint32_t)key, utf8str.c_str(), modifiers, native_scan_code, native_virtual_key, native_modifiers);
+ LLQtWebKit::getInstance()->keyboardEvent( mBrowserWindowId, LLQtWebKit::KE_KEY_UP, (uint32_t)key, utf8str.c_str(), modifiers, native_scan_code, native_virtual_key, native_modifiers);
+
checkEditState();
};
@@ -855,6 +859,7 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
std::string event = message_in.getValue("event");
S32 key = message_in.getValueS32("key");
std::string modifiers = message_in.getValue("modifiers");
+ LLSD native_key_data = message_in.getValueLLSD("native_key_data");
// Treat unknown events as key-up for safety.
LLQtWebKit::EKeyEvent key_event = LLQtWebKit::KE_KEY_UP;
@@ -867,14 +872,15 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
key_event = LLQtWebKit::KE_KEY_REPEAT;
}
- keyEvent(key_event, key, decodeModifiers(modifiers));
+ keyEvent(key_event, key, decodeModifiers(modifiers), native_key_data);
}
else if(message_name == "text_event")
{
std::string text = message_in.getValue("text");
std::string modifiers = message_in.getValue("modifiers");
+ LLSD native_key_data = message_in.getValueLLSD("native_key_data");
- unicodeInput(text, decodeModifiers(modifiers));
+ unicodeInput(text, decodeModifiers(modifiers), native_key_data);
}
if(message_name == "edit_cut")
{
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index cd7c002096..0c63dc3ae3 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -38,11 +38,13 @@ include(UnixInstall)
include(LLKDU)
include(ViewerMiscLibs)
include(LLLogin)
+include(GLOD)
include(CMakeCopyIfDifferent)
include_directories(
${DBUSGLIB_INCLUDE_DIRS}
${ELFIO_INCLUDE_DIR}
+ ${GLOD_INCLUDE_DIR}
${LLAUDIO_INCLUDE_DIRS}
${LLCHARACTER_INCLUDE_DIRS}
${LLCOMMON_INCLUDE_DIRS}
@@ -61,6 +63,8 @@ include_directories(
${LSCRIPT_INCLUDE_DIRS}
${LSCRIPT_INCLUDE_DIRS}/lscript_compile
${LLLOGIN_INCLUDE_DIRS}
+ ${LIBS_PREBUILT_DIR}/include/collada
+ ${LIBS_PREBUILT_DIR}/include/collada/1.4
)
set(viewer_SOURCE_FILES
@@ -161,6 +165,7 @@ set(viewer_SOURCE_FILES
llfloatercustomize.cpp
llfloaterdaycycle.cpp
llfloaterenvsettings.cpp
+ llfloaterevent.cpp
llfloaterfonttest.cpp
llfloatergesture.cpp
llfloatergodtools.cpp
@@ -171,6 +176,7 @@ set(viewer_SOURCE_FILES
llfloaterhelpbrowser.cpp
llfloaterhud.cpp
llfloaterimagepreview.cpp
+ llfloaterimportcollada.cpp
llfloaterinspect.cpp
llfloaterinventory.cpp
llfloaterjoystick.cpp
@@ -181,6 +187,7 @@ set(viewer_SOURCE_FILES
llfloatermediabrowser.cpp
llfloatermediasettings.cpp
llfloatermemleak.cpp
+ llfloatermodelpreview.cpp
llfloaternamedesc.cpp
llfloaternearbymedia.cpp
llfloaternotificationsconsole.cpp
@@ -273,6 +280,8 @@ set(viewer_SOURCE_FILES
llmediadataclient.cpp
llmemoryview.cpp
llmenucommands.cpp
+ llmeshrepository.cpp
+ llmeshreduction.cpp
llmetricperformancetester.cpp
llmimetypes.cpp
llmorphview.cpp
@@ -300,7 +309,6 @@ set(viewer_SOURCE_FILES
llpanelclassified.cpp
llpanelcontents.cpp
llpaneleditwearable.cpp
- llpanelevent.cpp
llpanelface.cpp
llpanelgroup.cpp
llpanelgroupgeneral.cpp
@@ -661,6 +669,7 @@ set(viewer_HEADER_FILES
llfloatercustomize.h
llfloaterdaycycle.h
llfloaterenvsettings.h
+ llfloaterevent.h
llfloaterfonttest.h
llfloatergesture.h
llfloatergodtools.h
@@ -671,6 +680,7 @@ set(viewer_HEADER_FILES
llfloaterhelpbrowser.h
llfloaterhud.h
llfloaterimagepreview.h
+ llfloaterimportcollada.h
llfloaterinspect.h
llfloaterinventory.h
llfloaterjoystick.h
@@ -681,6 +691,7 @@ set(viewer_HEADER_FILES
llfloatermediabrowser.h
llfloatermediasettings.h
llfloatermemleak.h
+ llfloatermodelpreview.h
llfloaternamedesc.h
llfloaternearbymedia.h
llfloaternotificationsconsole.h
@@ -773,6 +784,8 @@ set(viewer_HEADER_FILES
llmediadataclient.h
llmemoryview.h
llmenucommands.h
+ llmeshrepository.h
+ llmeshreduction.h
llmetricperformancetester.h
llmimetypes.h
llmorphview.h
@@ -795,7 +808,6 @@ set(viewer_HEADER_FILES
llpanelclassified.h
llpanelcontents.h
llpaneleditwearable.h
- llpanelevent.h
llpanelface.h
llpanelgroup.h
llpanelgroupgeneral.h
@@ -1183,6 +1195,7 @@ if (WINDOWS)
${DINPUT_LIBRARY}
${DXGUID_LIBRARY}
kernel32
+ libboost_system
odbc32
odbccp32
ole32
@@ -1606,6 +1619,7 @@ target_link_libraries(${VIEWER_BINARY_NAME}
${DBUSGLIB_LIBRARIES}
${OPENGL_LIBRARIES}
${FMODWRAPPER_LIBRARY} # must come after LLAudio
+ ${GLOD_LIBRARIES}
${OPENGL_LIBRARIES}
${SDL_LIBRARY}
${SMARTHEAP_LIBRARY}
diff --git a/indra/newview/app_settings/ignorable_dialogs.xml b/indra/newview/app_settings/ignorable_dialogs.xml
index e825f13e82..d0e1f62a84 100644
--- a/indra/newview/app_settings/ignorable_dialogs.xml
+++ b/indra/newview/app_settings/ignorable_dialogs.xml
@@ -177,17 +177,6 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>FirstStreamingMedia</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstStreamingMedia warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>FirstTeleport</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 8a447502b0..4207185dc2 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -2817,16 +2817,16 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>HadFirstSuccessfulLogin</key>
+ <key>FirstRunThisInstall</key>
<map>
<key>Comment</key>
- <string>Specifies whether you have successfully logged in at least once before</string>
+ <string>Specifies that you have not run the viewer since you installed the latest update</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>FirstSelectedDisabledPopups</key>
<map>
@@ -4633,6 +4633,17 @@
<key>Value</key>
<integer>410</integer>
</map>
+ <key>MePanelOpened</key>
+ <map>
+ <key>Comment</key>
+ <string>Indicates that Me Panel was opened at least once after Viewer was installed</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <real>0</real>
+ </map>
<key>MigrateCacheDirectory</key>
<map>
<key>Comment</key>
@@ -7386,6 +7397,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>RenderUseTriStrips</key>
+ <map>
+ <key>Comment</key>
+ <string>Use triangle strips for rendering prims.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>RenderUseFarClip</key>
<map>
<key>Comment</key>
@@ -7529,7 +7551,30 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>SafeMode</key>
+ <key>MeshThreadCount</key>
+ <map>
+ <key>Comment</key>
+ <string>Number of threads to use for loading meshes.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>8</integer>
+ </map>
+ <key>MeshMaxConcurrentRequests</key>
+ <map>
+ <key>Comment</key>
+ <string>Number of threads to use for loading meshes.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>32</integer>
+ </map>
+
+ <key>SafeMode</key>
<map>
<key>Comment</key>
<string>Reset preferences, run in safe mode.</string>
@@ -8399,7 +8444,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
<key>ShowTangentBasis</key>
<map>
@@ -8445,6 +8490,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>ShowVoiceVisualizersInCalls</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables in-world voice visualizers, voice gestures and lip-sync while in group or P2P calls.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>ShowVolumeSettingsPopup</key>
<map>
<key>Comment</key>
@@ -9938,50 +9994,6 @@
<key>Value</key>
<integer>15</integer>
</map>
- <key>UIButtonImageLeftPadding</key>
- <map>
- <key>Comment</key>
- <string>Button Overlay Image Left Padding</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>4</integer>
- </map>
- <key>UIButtonImageRightPadding</key>
- <map>
- <key>Comment</key>
- <string>Button Overlay Image Right Padding</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>4</integer>
- </map>
- <key>UIButtonImageTopPadding</key>
- <map>
- <key>Comment</key>
- <string>Button Overlay Image Top Padding</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>2</integer>
- </map>
- <key>UIButtonImageBottomPadding</key>
- <map>
- <key>Comment</key>
- <string>Button Overlay Image Bottom Padding</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>2</integer>
- </map>
<key>UploadBakedTexOld</key>
<map>
<key>Comment</key>
@@ -10123,7 +10135,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
<key>SpeakerParticipantRemoveDelay</key>
<map>
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl
index 1a7d58b07b..04e556c11a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl
@@ -9,7 +9,7 @@ vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
float calcDirectionalLight(vec3 n, vec3 l);
-float calcPointLight(vec3 v, vec3 n, vec4 lp, float la);
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
vec3 atmosAmbient(vec3 light);
vec3 atmosAffectDirectionalLight(float lightIntensity);
@@ -41,23 +41,22 @@ void main()
calcAtmospherics(pos.xyz);
//vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
- vec4 col;
- col.a = gl_Color.a;
-
- // Add windlight lights
- col.rgb = atmosAmbient(vec3(0.));
- col.rgb = scaleUpLight(col.rgb);
+
+ vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
// Collect normal lights (need to be divided by two, as we later multiply by 2)
- col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].linearAttenuation);
- col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].linearAttenuation);
- col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].linearAttenuation);
- col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].linearAttenuation);
- col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].linearAttenuation);
- col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].linearAttenuation);
+ col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a);
+ col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a);
+ col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a);
+ col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a);
+ col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a);
+ col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a);
col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
col.rgb = scaleDownLight(col.rgb);
+ // Add windlight lights
+ col.rgb += atmosAmbient(vec3(0.));
+
vary_light = gl_LightSource[0].position.xyz;
vary_ambient = col.rgb*gl_Color.rgb;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
index c1988d3c78..650fbcc3f5 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
@@ -10,7 +10,7 @@ mat4 getSkinnedTransform();
void calcAtmospherics(vec3 inPositionEye);
float calcDirectionalLight(vec3 n, vec3 l);
-float calcPointLight(vec3 v, vec3 n, vec4 lp, float la);
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
vec3 atmosAmbient(vec3 light);
vec3 atmosAffectDirectionalLight(float lightIntensity);
@@ -47,23 +47,22 @@ void main()
calcAtmospherics(pos.xyz);
//vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
- vec4 col;
- col.a = gl_Color.a;
-
- // Add windlight lights
- col.rgb = atmosAmbient(vec3(0.));
- col.rgb = scaleUpLight(col.rgb);
+
+ vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
// Collect normal lights (need to be divided by two, as we later multiply by 2)
- col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].linearAttenuation);
- col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].linearAttenuation);
- col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].linearAttenuation);
- col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].linearAttenuation);
- col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].linearAttenuation);
- col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].linearAttenuation);
+ col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a);
+ col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a);
+ col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a);
+ col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a);
+ col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a);
+ col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a);
col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
col.rgb = scaleDownLight(col.rgb);
+ // Add windlight lights
+ col.rgb += atmosAmbient(vec3(0.));
+
vary_ambient = col.rgb*gl_Color.rgb;
vary_directional = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a)));
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
index 28bcd720c0..2c8d90d1a6 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
@@ -5,7 +5,6 @@
* $License$
*/
-
#version 120
#extension GL_ARB_texture_rectangle : enable
@@ -15,6 +14,7 @@ uniform sampler2DRect specularRect;
uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
uniform samplerCube environmentMap;
+uniform sampler2DRect lightMap;
uniform sampler2D noiseMap;
uniform sampler2D lightFunc;
uniform sampler2D projectionMap;
@@ -26,12 +26,15 @@ uniform vec3 proj_n;
uniform float proj_focus; //distance from plane to begin blurring
uniform float proj_lod; //(number of mips in proj map)
uniform float proj_range; //range between near clip and far clip plane of projection
+uniform float proj_ambient_lod;
uniform float proj_ambiance;
uniform float near_clip;
uniform float far_clip;
uniform vec3 proj_origin; //origin of projection to be used for angular attenuation
uniform float sun_wash;
+uniform int proj_shadow_idx;
+uniform float shadow_fade;
varying vec4 vary_light;
@@ -40,6 +43,52 @@ uniform vec2 screen_res;
uniform mat4 inv_proj;
+vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = tc-vec2(0.5);
+
+ float det = max(1.0-lod/(proj_lod*0.5), 0.0);
+
+ float d = dot(dist,dist);
+
+ ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0)+det, 1.0);
+
+ return ret;
+}
+
+vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));
+
+ float det = min(lod/(proj_lod*0.5), 1.0);
+
+ float d = min(dist.x, dist.y);
+
+ float edge = 0.25*det;
+
+ ret *= clamp(d/edge, 0.0, 1.0);
+
+ return ret;
+}
+
+vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = tc-vec2(0.5);
+
+ float d = dot(dist,dist);
+
+ ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0);
+
+ return ret;
+}
+
+
vec4 getPosition(vec2 pos_screen)
{
float depth = texture2DRect(depthMap, pos_screen.xy).a;
@@ -68,7 +117,7 @@ void main()
{
discard;
}
-
+
vec3 norm = texture2DRect(normalMap, frag.xy).xyz*2.0-1.0;
norm = normalize(norm);
@@ -83,7 +132,11 @@ void main()
proj_tc.xyz /= proj_tc.w;
float fa = gl_Color.a+1.0;
- float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+ float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0);
+ if (dist_atten <= 0.0)
+ {
+ discard;
+ }
lv = proj_origin-pos.xyz;
lv = normalize(lv);
@@ -101,32 +154,32 @@ void main()
proj_tc.y > 0.0)
{
float lit = 0.0;
+ float amb_da = proj_ambiance;
+
if (da > 0.0)
{
float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);
float lod = diff * proj_lod;
- vec4 plcol = texture2DLod(projectionMap, proj_tc.xy, lod);
+ vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a;
lit = da * dist_atten * noise;
col = lcol*lit*diff_tex;
+ amb_da += (da*0.5)*proj_ambiance;
}
- float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0);
- float lod = diff * proj_lod;
- vec4 amb_plcol = texture2DLod(projectionMap, proj_tc.xy, lod);
- //float amb_da = mix(proj_ambiance, proj_ambiance*max(-da, 0.0), max(da, 0.0));
- float amb_da = proj_ambiance;
-
+ //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0);
+ vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod);
+
amb_da += (da*da*0.5+0.5)*proj_ambiance;
-
+
amb_da *= dist_atten * noise;
-
+
amb_da = min(amb_da, 1.0-lit);
-
+
col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
}
@@ -144,35 +197,28 @@ void main()
{
vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds;
- vec3 stc = (proj_mat * vec4(pfinal.xyz, 1.0)).xyz;
+ vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));
if (stc.z > 0.0)
{
- stc.xy /= stc.z+proj_near;
-
+ stc.xy /= stc.w;
+
+ float fatten = clamp(spec.a*spec.a+spec.a*0.5, 0.25, 1.0);
+
+ stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5);
+
if (stc.x < 1.0 &&
stc.y < 1.0 &&
stc.x > 0.0 &&
stc.y > 0.0)
{
- vec4 scol = texture2DLod(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
+ vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb;
}
}
}
}
- /*if (spec.a > 0.0)
- {
- //vec3 ref = reflect(normalize(pos), norm);
- float sa = dot(normalize(lv-normalize(pos)),norm);;
- //sa = max(sa, 0.0);
- //sa = pow(sa, 128.0 * spec.a*spec.a/dist_atten)*min(dist_atten*4.0, 1.0);
- sa = texture2D(lightFunc, vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0);
- sa *= noise;
- col += da*sa*lcol*spec.rgb;
- }*/
-
gl_FragColor.rgb = col;
gl_FragColor.a = 0.0;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl
index 22bdd2c7f3..fafc2ae3cc 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl
@@ -53,51 +53,61 @@ vec4 getPosition(vec2 pos_screen)
//calculate decreases in ambient lighting when crowded out (SSAO)
float calcAmbientOcclusion(vec4 pos, vec3 norm)
{
- vec2 kern[8];
- // exponentially (^2) distant occlusion samples spread around origin
- kern[0] = vec2(-1.0, 0.0) * 0.125*0.125;
- kern[1] = vec2(1.0, 0.0) * 0.250*0.250;
- kern[2] = vec2(0.0, 1.0) * 0.375*0.375;
- kern[3] = vec2(0.0, -1.0) * 0.500*0.500;
- kern[4] = vec2(0.7071, 0.7071) * 0.625*0.625;
- kern[5] = vec2(-0.7071, -0.7071) * 0.750*0.750;
- kern[6] = vec2(-0.7071, 0.7071) * 0.875*0.875;
- kern[7] = vec2(0.7071, -0.7071) * 1.000*1.000;
-
- vec2 pos_screen = vary_fragcoord.xy;
- vec3 pos_world = pos.xyz;
- vec2 noise_reflect = texture2D(noiseMap, vary_fragcoord.xy/128.0).xy;
+ float ret = 1.0;
- float angle_hidden = 0.0;
- int points = 0;
+ float dist = dot(pos.xyz,pos.xyz);
- float scale = min(ssao_radius / -pos_world.z, ssao_max_radius);
-
- // it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations (unrolling?)
- for (int i = 0; i < 8; i++)
+ if (dist < 64.0*64.0)
{
- vec2 samppos_screen = pos_screen + scale * reflect(kern[i], noise_reflect);
- vec3 samppos_world = getPosition(samppos_screen).xyz;
+ vec2 kern[8];
+ // exponentially (^2) distant occlusion samples spread around origin
+ kern[0] = vec2(-1.0, 0.0) * 0.125*0.125;
+ kern[1] = vec2(1.0, 0.0) * 0.250*0.250;
+ kern[2] = vec2(0.0, 1.0) * 0.375*0.375;
+ kern[3] = vec2(0.0, -1.0) * 0.500*0.500;
+ kern[4] = vec2(0.7071, 0.7071) * 0.625*0.625;
+ kern[5] = vec2(-0.7071, -0.7071) * 0.750*0.750;
+ kern[6] = vec2(-0.7071, 0.7071) * 0.875*0.875;
+ kern[7] = vec2(0.7071, -0.7071) * 1.000*1.000;
+
+ vec2 pos_screen = vary_fragcoord.xy;
+ vec3 pos_world = pos.xyz;
+ vec2 noise_reflect = texture2D(noiseMap, vary_fragcoord.xy/128.0).xy;
- vec3 diff = pos_world - samppos_world;
- float dist2 = dot(diff, diff);
+ float angle_hidden = 0.0;
+ int points = 0;
- // assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area
- // --> solid angle shrinking by the square of distance
- //radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2
- //(k should vary inversely with # of samples, but this is taken care of later)
+ float scale = min(ssao_radius / -pos_world.z, ssao_max_radius);
- //if (dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) // -0.05*norm to shift sample point back slightly for flat surfaces
- // angle_hidden += min(1.0/dist2, ssao_factor_inv); // dist != 0 follows from conditional. max of 1.0 (= ssao_factor_inv * ssao_factor)
- angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv);
+ // it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations (unrolling?)
+ for (int i = 0; i < 8; i++)
+ {
+ vec2 samppos_screen = pos_screen + scale * reflect(kern[i], noise_reflect);
+ vec3 samppos_world = getPosition(samppos_screen).xyz;
+
+ vec3 diff = pos_world - samppos_world;
+ float dist2 = dot(diff, diff);
+
+ // assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area
+ // --> solid angle shrinking by the square of distance
+ //radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2
+ //(k should vary inversely with # of samples, but this is taken care of later)
+
+ //if (dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) // -0.05*norm to shift sample point back slightly for flat surfaces
+ // angle_hidden += min(1.0/dist2, ssao_factor_inv); // dist != 0 follows from conditional. max of 1.0 (= ssao_factor_inv * ssao_factor)
+ angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv);
+
+ // 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"
+ points = points + int(diff.z > -1.0);
+ }
- // 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"
- points = points + int(diff.z > -1.0);
+ angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0);
+
+ ret = (1.0 - (float(points != 0) * angle_hidden));
+ ret += max((dist-32.0*32.0)/(32.0*32.0), 0.0);
}
- angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0);
-
- return (1.0 - (float(points != 0) * angle_hidden));
+ return min(ret, 1.0);
}
void main()
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl
index 3e8fdfb3e4..da49e59b89 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl
@@ -12,7 +12,8 @@ float calcDirectionalLight(vec3 n, vec3 l)
return a;
}
-float calcPointLight(vec3 v, vec3 n, vec4 lp, float la)
+
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight)
{
//get light vector
vec3 lv = lp.xyz-v;
@@ -26,9 +27,13 @@ float calcPointLight(vec3 v, vec3 n, vec4 lp, float la)
//distance attenuation
float da = clamp(1.0/(la * d), 0.0, 1.0);
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
+
//angular attenuation
da *= calcDirectionalLight(n, lv);
-
+
return da;
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
index 5991e1f3b5..1fae8c4da3 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
@@ -9,7 +9,7 @@ vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
float calcDirectionalLight(vec3 n, vec3 l);
-float calcPointLight(vec3 v, vec3 n, vec4 lp, float la);
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
vec3 atmosAmbient(vec3 light);
vec3 atmosAffectDirectionalLight(float lightIntensity);
@@ -42,23 +42,21 @@ void main()
calcAtmospherics(pos.xyz);
//vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
- vec4 col;
- col.a = gl_Color.a;
-
- // Add windlight lights
- col.rgb = atmosAmbient(vec3(0.));
- col.rgb = scaleUpLight(col.rgb);
+ vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
// Collect normal lights (need to be divided by two, as we later multiply by 2)
- col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].linearAttenuation);
- col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].linearAttenuation);
- col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].linearAttenuation);
- col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].linearAttenuation);
- col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].linearAttenuation);
- col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].linearAttenuation);
+ col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a);
+ col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a);
+ col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a);
+ col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a);
+ col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a);
+ col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a);
col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
col.rgb = scaleDownLight(col.rgb);
+ // Add windlight lights
+ col.rgb += atmosAmbient(vec3(0.));
+
vary_light = gl_LightSource[0].position.xyz;
vary_ambient = col.rgb*gl_Color.rgb;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl
index a939499b17..f8dd1b7431 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl
@@ -10,7 +10,7 @@ mat4 getSkinnedTransform();
void calcAtmospherics(vec3 inPositionEye);
float calcDirectionalLight(vec3 n, vec3 l);
-float calcPointLight(vec3 v, vec3 n, vec4 lp, float la);
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
vec3 atmosAmbient(vec3 light);
vec3 atmosAffectDirectionalLight(float lightIntensity);
@@ -53,23 +53,22 @@ void main()
calcAtmospherics(pos.xyz);
//vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
- vec4 col;
- col.a = gl_Color.a;
-
- // Add windlight lights
- col.rgb = atmosAmbient(vec3(0.));
- col.rgb = scaleUpLight(col.rgb);
+
+ vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
// Collect normal lights (need to be divided by two, as we later multiply by 2)
- col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].linearAttenuation);
- col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].linearAttenuation);
- col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].linearAttenuation);
- col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].linearAttenuation);
- col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].linearAttenuation);
- col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].linearAttenuation);
+ col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a);
+ col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a);
+ col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a);
+ col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a);
+ col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a);
+ col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a);
col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
col.rgb = scaleDownLight(col.rgb);
+ // Add windlight lights
+ col.rgb += atmosAmbient(vec3(0.));
+
vary_ambient = col.rgb*gl_Color.rgb;
vary_directional = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a)));
diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
index 651959413c..3e29c684e8 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
@@ -43,6 +43,52 @@ uniform vec2 screen_res;
uniform mat4 inv_proj;
+vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = tc-vec2(0.5);
+
+ float det = max(1.0-lod/(proj_lod*0.5), 0.0);
+
+ float d = dot(dist,dist);
+
+ ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0)+det, 1.0);
+
+ return ret;
+}
+
+vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));
+
+ float det = min(lod/(proj_lod*0.5), 1.0);
+
+ float d = min(dist.x, dist.y);
+
+ float edge = 0.25*det;
+
+ ret *= clamp(d/edge, 0.0, 1.0);
+
+ return ret;
+}
+
+vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = tc-vec2(0.5);
+
+ float d = dot(dist,dist);
+
+ ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0);
+
+ return ret;
+}
+
+
vec4 getPosition(vec2 pos_screen)
{
float depth = texture2DRect(depthMap, pos_screen.xy).a;
@@ -126,7 +172,7 @@ void main()
float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);
float lod = diff * proj_lod;
- vec4 plcol = texture2DLod(projectionMap, proj_tc.xy, lod);
+ vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a;
@@ -137,7 +183,7 @@ void main()
}
//float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0);
- vec4 amb_plcol = texture2DLod(projectionMap, proj_tc.xy, proj_ambient_lod);
+ vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod);
amb_da += (da*da*0.5+0.5)*proj_ambiance;
@@ -167,13 +213,17 @@ void main()
if (stc.z > 0.0)
{
stc.xy /= stc.w;
-
+
+ float fatten = clamp(spec.a*spec.a+spec.a*0.5, 0.25, 1.0);
+
+ stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5);
+
if (stc.x < 1.0 &&
stc.y < 1.0 &&
stc.x > 0.0 &&
stc.y > 0.0)
{
- vec4 scol = texture2DLod(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
+ vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb*shadow;
}
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
index d6534083cf..6617e33c0d 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
@@ -179,17 +179,6 @@ void main()
}
}
- /*if (spec.a > 0.0)
- {
- //vec3 ref = reflect(normalize(pos), norm);
- float sa = dot(normalize(lv-normalize(pos)),norm);;
- //sa = max(sa, 0.0);
- //sa = pow(sa, 128.0 * spec.a*spec.a/dist_atten)*min(dist_atten*4.0, 1.0);
- sa = texture2D(lightFunc, vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0);
- sa *= noise;
- col += da*sa*lcol*spec.rgb;
- }*/
-
//attenuate point light contribution by SSAO component
col *= texture2DRect(lightMap, frag.xy).g;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
index a0026edcd2..74a948f584 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
@@ -55,51 +55,61 @@ vec4 getPosition(vec2 pos_screen)
//calculate decreases in ambient lighting when crowded out (SSAO)
float calcAmbientOcclusion(vec4 pos, vec3 norm)
{
- vec2 kern[8];
- // exponentially (^2) distant occlusion samples spread around origin
- kern[0] = vec2(-1.0, 0.0) * 0.125*0.125;
- kern[1] = vec2(1.0, 0.0) * 0.250*0.250;
- kern[2] = vec2(0.0, 1.0) * 0.375*0.375;
- kern[3] = vec2(0.0, -1.0) * 0.500*0.500;
- kern[4] = vec2(0.7071, 0.7071) * 0.625*0.625;
- kern[5] = vec2(-0.7071, -0.7071) * 0.750*0.750;
- kern[6] = vec2(-0.7071, 0.7071) * 0.875*0.875;
- kern[7] = vec2(0.7071, -0.7071) * 1.000*1.000;
-
- vec2 pos_screen = vary_fragcoord.xy;
- vec3 pos_world = pos.xyz;
- vec2 noise_reflect = texture2D(noiseMap, vary_fragcoord.xy/128.0).xy;
-
- float angle_hidden = 0.0;
- int points = 0;
+ float ret = 1.0;
- float scale = min(ssao_radius / -pos_world.z, ssao_max_radius);
+ float dist = dot(pos.xyz,pos.xyz);
- // it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations (unrolling?)
- for (int i = 0; i < 8; i++)
+ if (dist < 64.0*64.0)
{
- vec2 samppos_screen = pos_screen + scale * reflect(kern[i], noise_reflect);
- vec3 samppos_world = getPosition(samppos_screen).xyz;
+ vec2 kern[8];
+ // exponentially (^2) distant occlusion samples spread around origin
+ kern[0] = vec2(-1.0, 0.0) * 0.125*0.125;
+ kern[1] = vec2(1.0, 0.0) * 0.250*0.250;
+ kern[2] = vec2(0.0, 1.0) * 0.375*0.375;
+ kern[3] = vec2(0.0, -1.0) * 0.500*0.500;
+ kern[4] = vec2(0.7071, 0.7071) * 0.625*0.625;
+ kern[5] = vec2(-0.7071, -0.7071) * 0.750*0.750;
+ kern[6] = vec2(-0.7071, 0.7071) * 0.875*0.875;
+ kern[7] = vec2(0.7071, -0.7071) * 1.000*1.000;
+
+ vec2 pos_screen = vary_fragcoord.xy;
+ vec3 pos_world = pos.xyz;
+ vec2 noise_reflect = texture2D(noiseMap, vary_fragcoord.xy/128.0).xy;
- vec3 diff = pos_world - samppos_world;
- float dist2 = dot(diff, diff);
+ float angle_hidden = 0.0;
+ int points = 0;
- // assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area
- // --> solid angle shrinking by the square of distance
- //radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2
- //(k should vary inversely with # of samples, but this is taken care of later)
+ float scale = min(ssao_radius / -pos_world.z, ssao_max_radius);
- //if (dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) // -0.05*norm to shift sample point back slightly for flat surfaces
- // angle_hidden += min(1.0/dist2, ssao_factor_inv); // dist != 0 follows from conditional. max of 1.0 (= ssao_factor_inv * ssao_factor)
- angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv);
+ // it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations (unrolling?)
+ for (int i = 0; i < 8; i++)
+ {
+ vec2 samppos_screen = pos_screen + scale * reflect(kern[i], noise_reflect);
+ vec3 samppos_world = getPosition(samppos_screen).xyz;
+
+ vec3 diff = pos_world - samppos_world;
+ float dist2 = dot(diff, diff);
+
+ // assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area
+ // --> solid angle shrinking by the square of distance
+ //radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2
+ //(k should vary inversely with # of samples, but this is taken care of later)
+
+ //if (dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) // -0.05*norm to shift sample point back slightly for flat surfaces
+ // angle_hidden += min(1.0/dist2, ssao_factor_inv); // dist != 0 follows from conditional. max of 1.0 (= ssao_factor_inv * ssao_factor)
+ angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv);
+
+ // 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"
+ points = points + int(diff.z > -1.0);
+ }
- // 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"
- points = points + int(diff.z > -1.0);
+ angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0);
+
+ ret = (1.0 - (float(points != 0) * angle_hidden));
+ ret += max((dist-32.0*32.0)/(32.0*32.0), 0.0);
}
- angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0);
-
- return (1.0 - (float(points != 0) * angle_hidden));
+ return min(ret, 1.0);
}
float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl)
@@ -224,11 +234,11 @@ void main()
//spotlight shadow 1
vec4 lpos = shadow_matrix[4]*spos;
- gl_FragColor[2] = pcfShadow(shadowMap4, lpos, 0.1).x;
+ gl_FragColor[2] = pcfShadow(shadowMap4, lpos, 0.8).x;
//spotlight shadow 2
lpos = shadow_matrix[5]*spos;
- gl_FragColor[3] = pcfShadow(shadowMap5, lpos, 0.1).x;
+ gl_FragColor[3] = pcfShadow(shadowMap5, lpos, 0.8).x;
//gl_FragColor.rgb = pos.xyz;
//gl_FragColor.b = shadow;
diff --git a/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl
index f4c59734a4..19800d96dc 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl
@@ -6,7 +6,7 @@
*/
float calcDirectionalLight(vec3 n, vec3 l);
-float calcPointLight(vec3 v, vec3 n, vec4 lp, float la);
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
vec3 atmosAmbient(vec3 light);
vec3 atmosAffectDirectionalLight(float lightIntensity);
@@ -18,9 +18,10 @@ vec4 sumLights(vec3 pos, vec3 norm, vec4 color, vec4 baseLight)
// Collect normal lights (need to be divided by two, as we later multiply by 2)
col.rgb += gl_LightSource[1].diffuse.rgb * calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
- col.rgb += gl_LightSource[2].diffuse.rgb * calcPointLight(pos, norm, gl_LightSource[2].position, gl_LightSource[2].linearAttenuation);
- col.rgb += gl_LightSource[3].diffuse.rgb * calcPointLight(pos, norm, gl_LightSource[3].position, gl_LightSource[3].linearAttenuation);
- //col.rgb += gl_LightSource[4].diffuse.rgb * calcPointLight(pos, norm, gl_LightSource[4].position, gl_LightSource[4].linearAttenuation);
+
+ col.rgb += gl_LightSource[2].diffuse.rgb * calcPointLightOrSpotLight(pos, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a);
+ col.rgb += gl_LightSource[3].diffuse.rgb * calcPointLightOrSpotLight(pos, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a);
+ //col.rgb += gl_LightSource[4].diffuse.rgb * calcPointLightOrSpotLight(pos, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a);
col.rgb = scaleDownLight(col.rgb);
// Add windlight lights
diff --git a/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl
index 1c5234c450..f129a1517b 100644
--- a/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl
+++ b/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl
@@ -6,7 +6,7 @@
*/
float calcDirectionalLight(vec3 n, vec3 l);
-float calcPointLight(vec3 v, vec3 n, vec4 lp, float la);
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
vec3 atmosAmbient(vec3 light);
vec3 atmosAffectDirectionalLight(float lightIntensity);
@@ -15,24 +15,21 @@ vec3 scaleUpLight(vec3 light);
vec4 sumLights(vec3 pos, vec3 norm, vec4 color, vec4 baseLight)
{
- vec4 col;
- col.a = color.a;
+ vec4 col = vec4(0.0, 0.0, 0.0, color.a);
- // Add windlight lights
- col.rgb = atmosAffectDirectionalLight(calcDirectionalLight(norm, gl_LightSource[0].position.xyz));
- col.rgb += atmosAmbient(baseLight.rgb);
- col.rgb = scaleUpLight(col.rgb);
-
// Collect normal lights (need to be divided by two, as we later multiply by 2)
- col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLight(pos, norm, gl_LightSource[2].position, gl_LightSource[2].linearAttenuation);
- col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLight(pos, norm, gl_LightSource[3].position, gl_LightSource[3].linearAttenuation);
- col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLight(pos, norm, gl_LightSource[4].position, gl_LightSource[4].linearAttenuation);
- col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLight(pos, norm, gl_LightSource[5].position, gl_LightSource[5].linearAttenuation);
- col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLight(pos, norm, gl_LightSource[6].position, gl_LightSource[6].linearAttenuation);
- col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLight(pos, norm, gl_LightSource[7].position, gl_LightSource[7].linearAttenuation);
+ col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a);
+ col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a);
+ col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a);
+ col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a);
+ col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a);
+ col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a);
col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
col.rgb = scaleDownLight(col.rgb);
-
+
+ // Add windlight lights
+ col.rgb += atmosAffectDirectionalLight(calcDirectionalLight(norm, gl_LightSource[0].position.xyz));
+ col.rgb += atmosAmbient(baseLight.rgb);
col.rgb = min(col.rgb*color.rgb, 1.0);
diff --git a/indra/newview/licenses-win32.txt b/indra/newview/licenses-win32.txt
index 7e6d4b4561..8736626907 100644
--- a/indra/newview/licenses-win32.txt
+++ b/indra/newview/licenses-win32.txt
@@ -769,3 +769,72 @@ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+=============
+GLOD license
+=============
+The GLOD Open-Source License Version 1.0 June 16, 2004
+
+Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns
+Hopkins University and David Luebke, Brenden Schubert, University of
+Virginia. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, is permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer and
+ request.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer and
+ request in the documentation and/or other materials provided with
+ the distribution.
+
+3. The name "GLOD" must not be used to endorse or promote products
+ derived from this software without prior written permission.
+
+4. Redistributions of any modified version of this source, whether in
+ source or binary form , must include a form of the following
+ acknowledgment: "This product is derived from the GLOD library,
+ which is available from http://www.cs.jhu.edu/~graphics/GLOD."
+
+5. Redistributions of any modified version of this source in binary
+ form must provide, free of charge, access to the modified version
+ of the code.
+
+6. This license shall be governed by and construed and enforced in
+ accordance with the laws of the State of Maryland, without
+ reference to its conflicts of law provisions. The exclusive
+ jurisdiction and venue for all legal actions relating to this
+ license shall be in courts of competent subject matter jurisdiction
+ located in the State of Maryland.
+
+TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, GLOD IS PROVIDED
+UNDER THIS LICENSE ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
+THAT GLOD IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR
+PURPOSE OR NON-INFRINGING. ALL WARRANTIES ARE DISCLAIMED AND THE
+ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE CODE IS WITH
+YOU. SHOULD ANY CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE
+COPYRIGHT HOLDER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY
+NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY
+CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY CODE IS
+AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL
+THE COPYRIGHT HOLDER OR ANY OTHER CONTRIBUTOR BE LIABLE FOR ANY
+SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES FOR LOSS OF
+PROFITS, REVENUE, OR FOR LOSS OF INFORMATION OR ANY OTHER LOSS.
+
+YOU EXPRESSLY AGREE TO FOREVER INDEMNIFY, DEFEND AND HOLD HARMLESS THE
+COPYRIGHT HOLDERS AND CONTRIBUTORS OF GLOD AGAINST ALL CLAIMS,
+DEMANDS, SUITS OR OTHER ACTIONS ARISING DIRECTLY OR INDIRECTLY FROM
+YOUR ACCEPTANCE AND USE OF GLOD.
+
+Although NOT REQUIRED, we would appreciate it if active users of GLOD
+put a link on their web site to the GLOD web site when possible.
+
+
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 9f2186f7f7..afd9d7b3f9 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -956,6 +956,7 @@ void LLAgent::sendMessage()
if (!mRegionp)
{
llerrs << "No region for agent yet!" << llendl;
+ return;
}
gMessageSystem->sendMessage(mRegionp->getHost());
}
@@ -4485,7 +4486,9 @@ void LLAgent::setCameraPosAndFocusGlobal(const LLVector3d& camera_pos, const LLV
{
const F64 ANIM_METERS_PER_SECOND = 10.0;
const F64 MIN_ANIM_SECONDS = 0.5;
+ const F64 MAX_ANIM_SECONDS = 10.0;
F64 anim_duration = llmax( MIN_ANIM_SECONDS, sqrt(focus_delta_squared) / ANIM_METERS_PER_SECOND );
+ anim_duration = llmin( anim_duration, MAX_ANIM_SECONDS );
setAnimationDuration( (F32)anim_duration );
}
@@ -5027,9 +5030,9 @@ void LLAgent::buildFullnameAndTitle(std::string& name) const
}
}
-BOOL LLAgent::isInGroup(const LLUUID& group_id) const
+BOOL LLAgent::isInGroup(const LLUUID& group_id, BOOL ignore_god_mode /* FALSE */) const
{
- if (isGodlike())
+ if (!ignore_god_mode && isGodlike())
return true;
S32 count = mGroups.count();
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index beede7fbe3..1573fd7131 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -982,7 +982,7 @@ private:
//--------------------------------------------------------------------
public:
// Checks against all groups in the entire agent group list.
- BOOL isInGroup(const LLUUID& group_id) const;
+ BOOL isInGroup(const LLUUID& group_id, BOOL ingnore_God_mod = FALSE) const;
protected:
// Only used for building titles.
BOOL isGroupMember() const { return !mGroupID.isNull(); }
diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp
index 7404fe5bc4..72ab9235cf 100644
--- a/indra/newview/llagentui.cpp
+++ b/indra/newview/llagentui.cpp
@@ -150,11 +150,17 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
sim_access_string.c_str());
break;
case LOCATION_FORMAT_NO_MATURITY:
- case LOCATION_FORMAT_FULL:
buffer = llformat("%s (%d, %d, %d)",
region_name.c_str(),
pos_x, pos_y, pos_z);
break;
+ case LOCATION_FORMAT_FULL:
+ buffer = llformat("%s (%d, %d, %d)%s%s",
+ region_name.c_str(),
+ pos_x, pos_y, pos_z,
+ sim_access_string.empty() ? "" : " - ",
+ sim_access_string.c_str());
+ break;
}
}
else
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 7cbd7e46a9..68ee9cd612 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -299,6 +299,10 @@ void LLAgentWearables::addWearableToAgentInventoryCallback::fire(const LLUUID& i
{
gAgentWearables.makeNewOutfitDone(mType, mIndex);
}
+ if (mTodo & CALL_WEARITEM)
+ {
+ LLAppearanceManager::instance().addCOFItemLink(inv_item, true);
+ }
}
void LLAgentWearables::addWearabletoAgentInventoryDone(const S32 type,
@@ -310,21 +314,24 @@ void LLAgentWearables::addWearabletoAgentInventoryDone(const S32 type,
return;
LLUUID old_item_id = getWearableItemID((EWearableType)type,index);
+
if (wearable)
{
wearable->setItemID(item_id);
- }
- if (old_item_id.notNull())
- {
- gInventory.addChangedMask(LLInventoryObserver::LABEL, old_item_id);
- setWearable((EWearableType)type,index,wearable);
- }
- else
- {
- pushWearable((EWearableType)type,wearable);
+ if (old_item_id.notNull())
+ {
+ gInventory.addChangedMask(LLInventoryObserver::LABEL, old_item_id);
+ setWearable((EWearableType)type,index,wearable);
+ }
+ else
+ {
+ pushWearable((EWearableType)type,wearable);
+ }
}
+
gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
+
LLViewerInventoryItem* item = gInventory.getItem(item_id);
if (item && wearable)
{
@@ -507,7 +514,7 @@ void LLAgentWearables::saveWearableAs(const EWearableType type,
type,
index,
new_wearable,
- addWearableToAgentInventoryCallback::CALL_UPDATE);
+ addWearableToAgentInventoryCallback::CALL_WEARITEM);
LLUUID category_id;
if (save_in_lost_and_found)
{
@@ -1287,25 +1294,29 @@ void LLAgentWearables::makeNewOutfit(const std::string& new_folder_name,
j,
new_wearable,
todo);
- if (isWearableCopyable((EWearableType)type, j))
- {
- copy_inventory_item(
- gAgent.getID(),
- item->getPermissions().getOwner(),
- item->getUUID(),
- folder_id,
- new_name,
- cb);
- }
- else
+ llassert(item);
+ if (item)
{
- move_inventory_item(
- gAgent.getID(),
- gAgent.getSessionID(),
- item->getUUID(),
- folder_id,
- new_name,
- cb);
+ if (isWearableCopyable((EWearableType)type, j))
+ {
+ copy_inventory_item(
+ gAgent.getID(),
+ item->getPermissions().getOwner(),
+ item->getUUID(),
+ folder_id,
+ new_name,
+ cb);
+ }
+ else
+ {
+ move_inventory_item(
+ gAgent.getID(),
+ gAgent.getSessionID(),
+ item->getUUID(),
+ folder_id,
+ new_name,
+ cb);
+ }
}
}
}
@@ -1412,7 +1423,7 @@ LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name)
new_folder_name);
LLPointer<LLInventoryCallback> cb = new LLShowCreatedOutfit(folder_id);
- LLAppearanceManager::instance().shallowCopyCategory(LLAppearanceManager::instance().getCOF(),folder_id, cb);
+ LLAppearanceManager::instance().shallowCopyCategoryContents(LLAppearanceManager::instance().getCOF(),folder_id, cb);
LLAppearanceManager::instance().createBaseOutfitLink(folder_id, cb);
return folder_id;
@@ -1594,32 +1605,35 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
LLWearable* new_wearable = wearables[i];
LLPointer<LLInventoryItem> new_item = items[i];
- const EWearableType type = new_wearable->getType();
- wearables_to_remove[type] = FALSE;
-
- // MULTI_WEARABLE: using 0th
- LLWearable* old_wearable = getWearable(type, 0);
- if (old_wearable)
+ llassert(new_wearable);
+ if (new_wearable)
{
- const LLUUID& old_item_id = getWearableItemID(type, 0);
- if ((old_wearable->getAssetID() == new_wearable->getAssetID()) &&
- (old_item_id == new_item->getUUID()))
- {
- lldebugs << "No change to wearable asset and item: " << LLWearableDictionary::getInstance()->getWearableEntry(type) << llendl;
- continue;
- }
+ const EWearableType type = new_wearable->getType();
+ wearables_to_remove[type] = FALSE;
- // Assumes existing wearables are not dirty.
- if (old_wearable->isDirty())
+ // MULTI_WEARABLE: using 0th
+ LLWearable* old_wearable = getWearable(type, 0);
+ if (old_wearable)
{
- llassert(0);
- continue;
+ const LLUUID& old_item_id = getWearableItemID(type, 0);
+ if ((old_wearable->getAssetID() == new_wearable->getAssetID()) &&
+ (old_item_id == new_item->getUUID()))
+ {
+ lldebugs << "No change to wearable asset and item: " << LLWearableDictionary::getInstance()->getWearableEntry(type) << llendl;
+ continue;
+ }
+
+ // Assumes existing wearables are not dirty.
+ if (old_wearable->isDirty())
+ {
+ llassert(0);
+ continue;
+ }
}
- }
- if (new_wearable)
new_wearable->setItemID(new_item->getUUID());
- setWearable(type,0,new_wearable);
+ setWearable(type,0,new_wearable);
+ }
}
std::vector<LLWearable*> wearables_being_removed;
@@ -2138,6 +2152,8 @@ void LLAgentWearables::updateServer()
void LLAgentWearables::populateMyOutfitsFolder(void)
{
+ llinfos << "starting outfit populate" << llendl;
+
LLLibraryOutfitsFetch* outfits = new LLLibraryOutfitsFetch();
// Get the complete information on the items in the inventory and
@@ -2329,7 +2345,7 @@ void LLLibraryOutfitsFetch::libraryDone(void)
LLUUID folder_id = gInventory.createNewCategory(mImportedClothingID,
LLFolderType::FT_NONE,
iter->second);
- LLAppearanceManager::getInstance()->shallowCopyCategory(iter->first, folder_id, copy_waiter);
+ LLAppearanceManager::getInstance()->shallowCopyCategoryContents(iter->first, folder_id, copy_waiter);
}
}
else
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index b4f58674af..858540a5f5 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -244,7 +244,8 @@ private:
CALL_UPDATE = 1,
CALL_RECOVERDONE = 2,
CALL_CREATESTANDARDDONE = 4,
- CALL_MAKENEWOUTFITDONE = 8
+ CALL_MAKENEWOUTFITDONE = 8,
+ CALL_WEARITEM = 16
};
// MULTI-WEARABLE: index is an EWearableType - more confusing usage.
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 326fc41c1e..eb4a47664b 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -48,6 +48,31 @@
#include "llviewerregion.h"
#include "llwearablelist.h"
+LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id,const std::string& name)
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+ LLNameCategoryCollector has_name(name);
+ gInventory.collectDescendentsIf(parent_id,
+ cat_array,
+ item_array,
+ LLInventoryModel::EXCLUDE_TRASH,
+ has_name);
+ if (0 == cat_array.count())
+ return LLUUID();
+ else
+ {
+ LLViewerInventoryCategory *cat = cat_array.get(0);
+ if (cat)
+ return cat->getUUID();
+ else
+ {
+ llwarns << "null cat" << llendl;
+ return LLUUID();
+ }
+ }
+}
+
// support for secondlife:///app/appearance SLapps
class LLAppearanceHandler : public LLCommandHandler
{
@@ -88,6 +113,8 @@ public:
protected:
~LLWearInventoryCategoryCallback()
{
+ llinfos << "done all inventory callbacks" << llendl;
+
// Is the destructor called by ordinary dereference, or because the app's shutting down?
// If the inventory callback manager goes away, we're shutting down, no longer want the callback.
if( LLInventoryCallbackManager::is_instantiated() )
@@ -125,12 +152,15 @@ protected:
void LLOutfitObserver::done()
{
+ llinfos << "done 2nd stage fetch" << llendl;
gInventory.removeObserver(this);
doOnIdle(boost::bind(&LLOutfitObserver::doWearCategory,this));
}
void LLOutfitObserver::doWearCategory()
{
+ llinfos << "starting" << llendl;
+
// We now have an outfit ready to be copied to agent inventory. Do
// it, and wear that outfit normally.
if(mCopyItems)
@@ -219,6 +249,8 @@ void LLOutfitFetch::done()
// What we do here is get the complete information on the items in
// the library, and set up an observer that will wait for that to
// happen.
+ llinfos << "done first stage fetch" << llendl;
+
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t item_array;
gInventory.collectDescendents(mCompleteFolders.front(),
@@ -279,6 +311,8 @@ public:
virtual ~LLUpdateAppearanceOnDestroy()
{
+ llinfos << "done update appearance on destroy" << llendl;
+
if (!LLApp::isExiting())
{
LLAppearanceManager::instance().updateAppearanceFromCOF();
@@ -287,6 +321,7 @@ public:
/* virtual */ void fire(const LLUUID& inv_item)
{
+ llinfos << "callback fired" << llendl;
mFireCount++;
}
private:
@@ -519,9 +554,33 @@ void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, boo
LLAppearanceManager::instance().updateCOF(category,append);
}
+// Create a copy of src_id + contents as a subfolder of dst_id.
void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
LLPointer<LLInventoryCallback> cb)
{
+ LLInventoryCategory *src_cat = gInventory.getCategory(src_id);
+ if (!src_cat)
+ {
+ llwarns << "folder not found for src " << src_id.asString() << llendl;
+ return;
+ }
+ LLUUID parent_id = dst_id;
+ if(parent_id.isNull())
+ {
+ parent_id = gInventory.getRootFolderID();
+ }
+ LLUUID subfolder_id = gInventory.createNewCategory( parent_id,
+ LLFolderType::FT_NONE,
+ src_cat->getName());
+ shallowCopyCategoryContents(src_id, subfolder_id, cb);
+
+ gInventory.notifyObservers();
+}
+
+// Copy contents of src_id to dst_id.
+void LLAppearanceManager::shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id,
+ LLPointer<LLInventoryCallback> cb)
+{
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
gInventory.collectDescendents(src_id, cats, items,
@@ -617,6 +676,11 @@ void LLAppearanceManager::filterWearableItems(
if (!item->isWearableType())
continue;
EWearableType type = item->getWearableType();
+ if(type < 0 || type >= WT_COUNT)
+ {
+ LL_WARNS("Appearance") << "Invalid wearable type. Inventory type does not match wearable flag bitfield." << LL_ENDL;
+ continue;
+ }
items_by_type[type].push_back(item);
}
@@ -654,6 +718,8 @@ void LLAppearanceManager::linkAll(const LLUUID& category,
void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
{
+ llinfos << "starting" << llendl;
+
const LLUUID cof = getCOF();
// Deactivate currently active gestures in the COF, if replacing outfit
@@ -711,6 +777,7 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
gInventory.notifyObservers();
// Create links to new COF contents.
+ llinfos << "creating LLUpdateAppearanceOnDestroy" << llendl;
LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy;
linkAll(cof, body_items, link_waiter);
@@ -723,6 +790,7 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
{
createBaseOutfitLink(category, link_waiter);
}
+ llinfos << "waiting for LLUpdateAppearanceOnDestroy" << llendl;
}
void LLAppearanceManager::updatePanelOutfitName(const std::string& name)
@@ -794,6 +862,8 @@ void LLAppearanceManager::updateAppearanceFromCOF()
{
// update dirty flag to see if the state of the COF matches
// the saved outfit stored as a folder link
+ llinfos << "starting" << llendl;
+
updateIsDirty();
dumpCat(getCOF(),"COF, start");
@@ -924,8 +994,9 @@ void LLAppearanceManager::wearInventoryCategory(LLInventoryCategory* category, b
{
if(!category) return;
- lldebugs << "wearInventoryCategory( " << category->getName()
+ llinfos << "wearInventoryCategory( " << category->getName()
<< " )" << llendl;
+
// What we do here is get the complete information on the items in
// the inventory, and set up an observer that will wait for that to
// happen.
@@ -954,7 +1025,8 @@ void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* ca
// this up front to avoid having to deal with the case of multiple
// wearables being dirty.
if(!category) return;
- lldebugs << "wearInventoryCategoryOnAvatar( " << category->getName()
+
+ llinfos << "wearInventoryCategoryOnAvatar( " << category->getName()
<< " )" << llendl;
if( gFloaterCustomize )
@@ -1231,6 +1303,23 @@ void LLAppearanceManager::updateIsDirty()
}
}
+void LLAppearanceManager::onFirstFullyVisible()
+{
+ // If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account)
+ // then auto-populate outfits from the library into the My Outfits folder.
+
+ llinfos << "avatar fully visible" << llendl;
+
+ static bool check_populate_my_outfits = true;
+ if (check_populate_my_outfits &&
+ (LLInventoryModel::getIsFirstTimeInViewer2()
+ || gSavedSettings.getBOOL("MyOutfitsAutofill")))
+ {
+ gAgentWearables.populateMyOutfitsFolder();
+ }
+ check_populate_my_outfits = false;
+}
+
//#define DUMP_CAT_VERBOSE
void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg)
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 38d1e01d08..28b51ee0f6 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -35,6 +35,8 @@
#include "llsingleton.h"
#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
+#include "llviewerinventory.h"
#include "llcallbacklist.h"
class LLWearable;
@@ -54,10 +56,14 @@ public:
void wearOutfitByName(const std::string& name);
void changeOutfit(bool proceed, const LLUUID& category, bool append);
- // Copy all items in a category.
+ // Copy all items and the src category itself.
void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
LLPointer<LLInventoryCallback> cb);
+ // Copy all items in a category.
+ void shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id,
+ LLPointer<LLInventoryCallback> cb);
+
// Find the Current Outfit folder.
const LLUUID getCOF() const;
@@ -107,6 +113,9 @@ public:
// should only be necessary to do on initial login.
void updateIsDirty();
+ // Called when self avatar is first fully visible.
+ void onFirstFullyVisible();
+
protected:
LLAppearanceManager();
~LLAppearanceManager();
@@ -144,6 +153,8 @@ public:
#define SUPPORT_ENSEMBLES 0
+LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id,const std::string& name);
+
// Shim class and template function to allow arbitrary boost::bind
// expressions to be run as one-time idle callbacks.
template <typename T>
@@ -212,4 +223,103 @@ void doOnIdleRepeating(T callable)
gIdleCallbacks.addFunction(&OnIdleCallbackRepeating<T>::onIdle,cb_functor);
}
+template <class T>
+class CallAfterCategoryFetchStage2: public LLInventoryFetchObserver
+{
+public:
+ CallAfterCategoryFetchStage2(T callable):
+ mCallable(callable)
+ {
+ }
+ ~CallAfterCategoryFetchStage2()
+ {
+ }
+ virtual void done()
+ {
+ gInventory.removeObserver(this);
+ doOnIdle(mCallable);
+ delete this;
+ }
+protected:
+ T mCallable;
+};
+
+template <class T>
+class CallAfterCategoryFetchStage1: public LLInventoryFetchDescendentsObserver
+{
+public:
+ CallAfterCategoryFetchStage1(T callable):
+ mCallable(callable)
+ {
+ }
+ ~CallAfterCategoryFetchStage1()
+ {
+ }
+ virtual void done()
+ {
+ // What we do here is get the complete information on the items in
+ // the library, and set up an observer that will wait for that to
+ // happen.
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+ gInventory.collectDescendents(mCompleteFolders.front(),
+ cat_array,
+ item_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+ S32 count = item_array.count();
+ if(!count)
+ {
+ llwarns << "Nothing fetched in category " << mCompleteFolders.front()
+ << llendl;
+ //dec_busy_count();
+ gInventory.removeObserver(this);
+ delete this;
+ return;
+ }
+
+ CallAfterCategoryFetchStage2<T> *stage2 = new CallAfterCategoryFetchStage2<T>(mCallable);
+ LLInventoryFetchObserver::item_ref_t ids;
+ for(S32 i = 0; i < count; ++i)
+ {
+ ids.push_back(item_array.get(i)->getUUID());
+ }
+
+ gInventory.removeObserver(this);
+
+ // do the fetch
+ stage2->fetchItems(ids);
+ if(stage2->isEverythingComplete())
+ {
+ // everything is already here - call done.
+ stage2->done();
+ }
+ else
+ {
+ // it's all on it's way - add an observer, and the inventory
+ // will call done for us when everything is here.
+ gInventory.addObserver(stage2);
+ }
+ delete this;
+ }
+protected:
+ T mCallable;
+};
+
+template <class T>
+void callAfterCategoryFetch(const LLUUID& cat_id, T callable)
+{
+ CallAfterCategoryFetchStage1<T> *stage1 = new CallAfterCategoryFetchStage1<T>(callable);
+ LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+ folders.push_back(cat_id);
+ stage1->fetchDescendents(folders);
+ if (stage1->isEverythingComplete())
+ {
+ stage1->done();
+ }
+ else
+ {
+ gInventory.addObserver(stage1);
+ }
+}
+
#endif
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 0edeae9362..fd047abad6 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -40,6 +40,7 @@
#include "lluictrlfactory.h"
#include "lltexteditor.h"
#include "llerrorcontrol.h"
+#include "lleventtimer.h"
#include "llviewertexturelist.h"
#include "llgroupmgr.h"
#include "llagent.h"
@@ -47,6 +48,7 @@
#include "llwindow.h"
#include "llviewerstats.h"
#include "llmd5.h"
+#include "llmeshrepository.h"
#include "llpumpio.h"
#include "llmimetypes.h"
#include "llslurl.h"
@@ -919,6 +921,9 @@ static LLFastTimer::DeclareTimer FTM_LFS("LFS Thread");
static LLFastTimer::DeclareTimer FTM_PAUSE_THREADS("Pause Threads");
static LLFastTimer::DeclareTimer FTM_IDLE("Idle");
static LLFastTimer::DeclareTimer FTM_PUMP("Pump");
+static LLFastTimer::DeclareTimer FTM_PUMP_ARES("Ares");
+static LLFastTimer::DeclareTimer FTM_PUMP_SERVICE("Service");
+static LLFastTimer::DeclareTimer FTM_SERVICE_CALLBACK("Callback");
bool LLAppViewer::mainLoop()
{
@@ -1030,10 +1035,20 @@ bool LLAppViewer::mainLoop()
LLMemType mt_ip(LLMemType::MTYPE_IDLE_PUMP);
pingMainloopTimeout("Main:ServicePump");
LLFastTimer t4(FTM_PUMP);
- gAres->process();
- // this pump is necessary to make the login screen show up
- gServicePump->pump();
- gServicePump->callback();
+ {
+ LLFastTimer t(FTM_PUMP_ARES);
+ gAres->process();
+ }
+ {
+ LLFastTimer t(FTM_PUMP_SERVICE);
+ // this pump is necessary to make the login screen show up
+ gServicePump->pump();
+
+ {
+ LLFastTimer t(FTM_SERVICE_CALLBACK);
+ gServicePump->callback();
+ }
+ }
}
resumeMainloopTimeout();
@@ -1272,6 +1287,9 @@ bool LLAppViewer::cleanup()
llinfos << "Cleaning Up" << llendflush;
+ // shut down mesh streamer
+ gMeshRepo.shutdown();
+
// Must clean up texture references before viewer window is destroyed.
LLHUDManager::getInstance()->updateEffects();
LLHUDObject::updateAll();
@@ -1353,9 +1371,6 @@ bool LLAppViewer::cleanup()
llinfos << "Cache files removed" << llendflush;
-
- cleanup_menus();
-
// Wait for any pending VFS IO
while (1)
{
@@ -1681,7 +1696,7 @@ bool LLAppViewer::initThreads()
// Image decoding
LLAppViewer::sImageDecodeThread = new LLImageDecodeThread(enable_threads && true);
LLAppViewer::sTextureCache = new LLTextureCache(enable_threads && true);
- LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), sImageDecodeThread, enable_threads && false);
+ LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), sImageDecodeThread, enable_threads && true);
LLImage::initClass();
if (LLFastTimer::sLog || LLFastTimer::sMetricLog)
@@ -1691,6 +1706,9 @@ bool LLAppViewer::initThreads()
mFastTimerLogThread->start();
}
+ // Mesh streaming and caching
+ gMeshRepo.init();
+
// *FIX: no error handling here!
return true;
}
@@ -1935,7 +1953,6 @@ bool LLAppViewer::initConfiguration()
// LLFirstUse::addConfigVariable("FirstSandbox");
// LLFirstUse::addConfigVariable("FirstFlexible");
// LLFirstUse::addConfigVariable("FirstDebugMenus");
-// LLFirstUse::addConfigVariable("FirstStreamingMedia");
// LLFirstUse::addConfigVariable("FirstSculptedPrim");
// LLFirstUse::addConfigVariable("FirstVoice");
// LLFirstUse::addConfigVariable("FirstMedia");
@@ -2365,9 +2382,6 @@ bool LLAppViewer::initWindow()
// store setting in a global for easy access and modification
gNoRender = gSavedSettings.getBOOL("DisableRendering");
- // Hide the splash screen
- LLSplashScreen::hide();
-
// always start windowed
BOOL ignorePixelDepth = gSavedSettings.getBOOL("IgnorePixelDepth");
gViewerWindow = new LLViewerWindow(gWindowTitle,
@@ -2406,6 +2420,7 @@ bool LLAppViewer::initWindow()
gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
gPipeline.init();
+
stop_glerror();
gViewerWindow->initGLDefaults();
@@ -2611,7 +2626,7 @@ void LLAppViewer::handleViewerCrash()
gDebugInfo["StartupState"] = LLStartUp::getStartupStateString();
gDebugInfo["RAMInfo"]["Allocated"] = (LLSD::Integer) LLMemory::getCurrentRSS() >> 10;
gDebugInfo["FirstLogin"] = (LLSD::Boolean) gAgent.isFirstLogin();
- gDebugInfo["HadFirstSuccessfulLogin"] = gSavedSettings.getBOOL("HadFirstSuccessfulLogin");
+ gDebugInfo["FirstRunThisInstall"] = gSavedSettings.getBOOL("FirstRunThisInstall");
if(gLogoutInProgress)
{
@@ -3010,7 +3025,7 @@ bool LLAppViewer::initCache()
// Purge cache if it belongs to an old version
else
{
- static const S32 cache_version = 5;
+ static const S32 cache_version = 6;
if (gSavedSettings.getS32("LocalCacheVersion") != cache_version)
{
mPurgeCache = true;
@@ -3391,6 +3406,10 @@ static LLFastTimer::DeclareTimer FTM_OBJECTLIST_UPDATE("Update Objectlist");
static LLFastTimer::DeclareTimer FTM_REGION_UPDATE("Update Region");
static LLFastTimer::DeclareTimer FTM_WORLD_UPDATE("Update World");
static LLFastTimer::DeclareTimer FTM_NETWORK("Network");
+static LLFastTimer::DeclareTimer FTM_AGENT_NETWORK("Agent Network");
+static LLFastTimer::DeclareTimer FTM_AGENT_AUTOPILOT("Autopilot");
+static LLFastTimer::DeclareTimer FTM_AGENT_UPDATE("Update");
+static LLFastTimer::DeclareTimer FTM_VLMANAGER("VL Manager");
///////////////////////////////////////////////////////
// idle()
@@ -3461,7 +3480,7 @@ void LLAppViewer::idle()
if (!gDisconnected)
{
- LLFastTimer t(FTM_NETWORK);
+ LLFastTimer t(FTM_AGENT_NETWORK);
// Update spaceserver timeinfo
LLWorld::getInstance()->setSpaceTimeUSec(LLWorld::getInstance()->getSpaceTimeUSec() + (U32)(dt_raw * SEC_TO_MICROSEC));
@@ -3476,9 +3495,12 @@ void LLAppViewer::idle()
gAgent.moveYaw(-1.f);
}
- // Handle automatic walking towards points
- gAgentPilot.updateTarget();
- gAgent.autoPilot(&yaw);
+ {
+ LLFastTimer t(FTM_AGENT_AUTOPILOT);
+ // Handle automatic walking towards points
+ gAgentPilot.updateTarget();
+ gAgent.autoPilot(&yaw);
+ }
static LLFrameTimer agent_update_timer;
static U32 last_control_flags;
@@ -3489,6 +3511,7 @@ void LLAppViewer::idle()
if (flags_changed || (agent_update_time > (1.0f / (F32) AGENT_UPDATES_PER_SECOND)))
{
+ LLFastTimer t(FTM_AGENT_UPDATE);
// Send avatar and camera info
last_control_flags = gAgent.getControlFlags();
send_agent_update(TRUE);
@@ -3654,7 +3677,7 @@ void LLAppViewer::idle()
//
{
- LLFastTimer t(FTM_NETWORK);
+ LLFastTimer t(FTM_VLMANAGER);
gVLManager.unpackData();
}
@@ -3900,6 +3923,11 @@ static F32 CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME;
#endif
static LLFastTimer::DeclareTimer FTM_IDLE_NETWORK("Idle Network");
+static LLFastTimer::DeclareTimer FTM_MESSAGE_ACKS("Message Acks");
+static LLFastTimer::DeclareTimer FTM_RETRANSMIT("Retransmit");
+static LLFastTimer::DeclareTimer FTM_TIMEOUT_CHECK("Timeout Check");
+static LLFastTimer::DeclareTimer FTM_DYNAMIC_THROTTLE("Dynamic Throttle");
+static LLFastTimer::DeclareTimer FTM_CHECK_REGION_CIRCUIT("Check Region Circuit");
void LLAppViewer::idleNetwork()
{
@@ -3953,7 +3981,10 @@ void LLAppViewer::idleNetwork()
}
// Handle per-frame message system processing.
- gMessageSystem->processAcks();
+ {
+ LLFastTimer ftm(FTM_MESSAGE_ACKS);
+ gMessageSystem->processAcks();
+ }
#ifdef TIME_THROTTLE_MESSAGES
if (total_time >= CheckMessagesMaxTime)
@@ -3991,26 +4022,41 @@ void LLAppViewer::idleNetwork()
LLViewerStats::getInstance()->mNumNewObjectsStat.addValue(gObjectList.mNumNewObjects);
// Retransmit unacknowledged packets.
- gXferManager->retransmitUnackedPackets();
- gAssetStorage->checkForTimeouts();
+ {
+ LLFastTimer ftm(FTM_RETRANSMIT);
+ gXferManager->retransmitUnackedPackets();
+ }
+
+ {
+ LLFastTimer ftm(FTM_TIMEOUT_CHECK);
+ gAssetStorage->checkForTimeouts();
+ }
+
llpushcallstacks ;
- gViewerThrottle.updateDynamicThrottle();
+
+ {
+ LLFastTimer ftm(FTM_DYNAMIC_THROTTLE);
+ gViewerThrottle.updateDynamicThrottle();
+ }
llpushcallstacks ;
// Check that the circuit between the viewer and the agent's current
// region is still alive
- LLViewerRegion *agent_region = gAgent.getRegion();
- if (agent_region && (LLStartUp::getStartupState()==STATE_STARTED))
{
- LLUUID this_region_id = agent_region->getRegionID();
- bool this_region_alive = agent_region->isAlive();
- if ((mAgentRegionLastAlive && !this_region_alive) // newly dead
- && (mAgentRegionLastID == this_region_id)) // same region
+ LLFastTimer ftm(FTM_CHECK_REGION_CIRCUIT);
+ LLViewerRegion *agent_region = gAgent.getRegion();
+ if (agent_region && (LLStartUp::getStartupState()==STATE_STARTED))
{
- forceDisconnect(LLTrans::getString("AgentLostConnection"));
+ LLUUID this_region_id = agent_region->getRegionID();
+ bool this_region_alive = agent_region->isAlive();
+ if ((mAgentRegionLastAlive && !this_region_alive) // newly dead
+ && (mAgentRegionLastID == this_region_id)) // same region
+ {
+ forceDisconnect(LLTrans::getString("AgentLostConnection"));
+ }
+ mAgentRegionLastID = this_region_id;
+ mAgentRegionLastAlive = this_region_alive;
}
- mAgentRegionLastID = this_region_id;
- mAgentRegionLastAlive = this_region_alive;
}
llpushcallstacks ;
}
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index a011c5ebfd..a915b7fa50 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -36,6 +36,7 @@
#include "llallocator.h"
#include "llcontrol.h"
#include "llsys.h" // for LLOSInfo
+#include "lltimer.h"
class LLCommandLineParser;
class LLFrameTimer;
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp
index a2322e28b4..a0be6efdc2 100644
--- a/indra/newview/llassetuploadresponders.cpp
+++ b/indra/newview/llassetuploadresponders.cpp
@@ -41,6 +41,7 @@
#include "llfilepicker.h"
#include "llinventoryobserver.h"
#include "llinventorypanel.h"
+#include "llfloaterimportcollada.h"
#include "llpermissionsflags.h"
#include "llpreviewnotecard.h"
#include "llpreviewscript.h"
@@ -64,6 +65,7 @@
#include "llnotificationsutil.h"
#include "llscrolllistctrl.h"
#include "llsdserialize.h"
+#include "llsdutil.h"
#include "llvfs.h"
// When uploading multiple files, don't display any of them when uploading more than this number.
@@ -71,6 +73,120 @@ static const S32 FILE_COUNT_DISPLAY_THRESHOLD = 5;
void dialog_refresh_all();
+static void on_new_single_inventory_upload_complete(
+ LLAssetType::EType asset_type,
+ LLInventoryType::EType inventory_type,
+ const std::string inventory_type_string,
+ const LLUUID& item_folder_id,
+ const std::string& item_name,
+ const std::string& item_description,
+ const LLSD& server_response,
+ S32 upload_price)
+{
+ if ( upload_price > 0 )
+ {
+ // this upload costed us L$, update our balance
+ // and display something saying that it cost L$
+ LLStatusBar::sendMoneyBalanceRequest();
+
+ LLSD args;
+ args["AMOUNT"] = llformat("%d", upload_price);
+ LLNotificationsUtil::add("UploadPayment", args);
+ }
+
+ // Actually add the upload to viewer inventory
+ llinfos << "Adding " << server_response["new_inventory_item"].asUUID()
+ << " " << server_response["new_asset"].asUUID()
+ << " to inventory." << llendl;
+
+ if( item_folder_id.notNull() )
+ {
+ U32 everyone_perms = PERM_NONE;
+ U32 group_perms = PERM_NONE;
+ U32 next_owner_perms = PERM_ALL;
+ if( server_response.has("new_next_owner_mask") )
+ {
+ // The server provided creation perms so use them.
+ // Do not assume we got the perms we asked for in
+ // since the server may not have granted them all.
+ everyone_perms = server_response["new_everyone_mask"].asInteger();
+ group_perms = server_response["new_group_mask"].asInteger();
+ next_owner_perms = server_response["new_next_owner_mask"].asInteger();
+ }
+ else
+ {
+ // The server doesn't provide creation perms
+ // so use old assumption-based perms.
+ if( inventory_type_string != "snapshot")
+ {
+ next_owner_perms = PERM_MOVE | PERM_TRANSFER;
+ }
+ }
+
+ LLPermissions new_perms;
+ new_perms.init(
+ gAgent.getID(),
+ gAgent.getID(),
+ LLUUID::null,
+ LLUUID::null);
+
+ new_perms.initMasks(
+ PERM_ALL,
+ PERM_ALL,
+ everyone_perms,
+ group_perms,
+ next_owner_perms);
+
+ S32 creation_date_now = time_corrected();
+ LLPointer<LLViewerInventoryItem> item = new LLViewerInventoryItem(
+ server_response["new_inventory_item"].asUUID(),
+ item_folder_id,
+ new_perms,
+ server_response["new_asset"].asUUID(),
+ asset_type,
+ inventory_type,
+ item_name,
+ item_description,
+ LLSaleInfo::DEFAULT,
+ LLInventoryItem::II_FLAGS_NONE,
+ creation_date_now);
+
+ gInventory.updateItem(item);
+ gInventory.notifyObservers();
+
+ // Show the preview panel for textures and sounds to let
+ // user know that the image (or snapshot) arrived intact.
+ LLInventoryPanel* panel = LLInventoryPanel::getActiveInventoryPanel();
+ if ( panel )
+ {
+ LLFocusableElement* focus = gFocusMgr.getKeyboardFocus();
+
+ panel->setSelection(
+ server_response["new_inventory_item"].asUUID(),
+ TAKE_FOCUS_NO);
+
+ if(
+ (LLAssetType::AT_TEXTURE == asset_type ||
+ LLAssetType::AT_SOUND == asset_type) &&
+ (LLFilePicker::instance().getFileCount() <=
+ FILE_COUNT_DISPLAY_THRESHOLD) )
+ {
+ panel->openSelected();
+ }
+
+ // restore keyboard focus
+ gFocusMgr.setKeyboardFocus(focus);
+ }
+ }
+ else
+ {
+ llwarns << "Can't find a folder to put it in" << llendl;
+ }
+
+ // remove the "Uploading..." message
+ LLUploadDialog::modalUploadFinished();
+}
+
LLAssetUploadResponder::LLAssetUploadResponder(const LLSD &post_data,
const LLUUID& vfile_id,
LLAssetType::EType asset_type)
@@ -88,9 +204,10 @@ LLAssetUploadResponder::LLAssetUploadResponder(const LLSD &post_data,
}
}
-LLAssetUploadResponder::LLAssetUploadResponder(const LLSD &post_data,
- const std::string& file_name,
- LLAssetType::EType asset_type)
+LLAssetUploadResponder::LLAssetUploadResponder(
+ const LLSD &post_data,
+ const std::string& file_name,
+ LLAssetType::EType asset_type)
: LLHTTPClient::Responder(),
mPostData(post_data),
mFileName(file_name),
@@ -138,6 +255,7 @@ void LLAssetUploadResponder::result(const LLSD& content)
lldebugs << "LLAssetUploadResponder::result from capabilities" << llendl;
std::string state = content["state"];
+
if (state == "upload")
{
uploadUpload(content);
@@ -196,16 +314,36 @@ void LLAssetUploadResponder::uploadComplete(const LLSD& content)
{
}
-LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(const LLSD& post_data,
- const LLUUID& vfile_id,
- LLAssetType::EType asset_type)
-: LLAssetUploadResponder(post_data, vfile_id, asset_type)
+LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(
+ const LLSD& post_data,
+ const LLUUID& vfile_id,
+ LLAssetType::EType asset_type)
+ : LLAssetUploadResponder(post_data, vfile_id, asset_type)
{
}
-LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(const LLSD& post_data, const std::string& file_name, LLAssetType::EType asset_type)
-: LLAssetUploadResponder(post_data, file_name, asset_type)
+LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(
+ const LLSD& post_data,
+ const std::string& file_name,
+ LLAssetType::EType asset_type)
+ : LLAssetUploadResponder(post_data, file_name, asset_type)
+{
+}
+
+// virtual
+void LLNewAgentInventoryResponder::error(U32 statusNum, const std::string& reason)
+{
+ LLAssetUploadResponder::error(statusNum, reason);
+ LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, LLUUID(), FALSE);
+}
+
+
+//virtual
+void LLNewAgentInventoryResponder::uploadFailure(const LLSD& content)
{
+ LLAssetUploadResponder::uploadFailure(content);
+
+ LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, content["new_asset"], FALSE);
}
//virtual
@@ -219,95 +357,31 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
LLAssetType::EType asset_type = LLAssetType::lookup(mPostData["asset_type"].asString());
LLInventoryType::EType inventory_type = LLInventoryType::lookup(mPostData["inventory_type"].asString());
- S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+ S32 expected_upload_cost = 0;
// Update L$ and ownership credit information
// since it probably changed on the server
if (asset_type == LLAssetType::AT_TEXTURE ||
asset_type == LLAssetType::AT_SOUND ||
- asset_type == LLAssetType::AT_ANIMATION)
+ asset_type == LLAssetType::AT_ANIMATION ||
+ asset_type == LLAssetType::AT_MESH)
{
- LLStatusBar::sendMoneyBalanceRequest();
-
- LLSD args;
- args["AMOUNT"] = llformat("%d", expected_upload_cost);
- LLNotificationsUtil::add("UploadPayment", args);
+ expected_upload_cost =
+ LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
}
- // Actually add the upload to viewer inventory
- llinfos << "Adding " << content["new_inventory_item"].asUUID() << " "
- << content["new_asset"].asUUID() << " to inventory." << llendl;
- if(mPostData["folder_id"].asUUID().notNull())
- {
- //std::ostringstream out;
- //LLSDXMLFormatter *formatter = new LLSDXMLFormatter;
- //formatter->format(mPostData, out, LLSDFormatter::OPTIONS_PRETTY);
- //llinfos << "Post Data: " << out.str() << llendl;
+ on_new_single_inventory_upload_complete(
+ asset_type,
+ inventory_type,
+ mPostData["asset_type"].asString(),
+ mPostData["folder_id"].asUUID(),
+ mPostData["name"],
+ mPostData["description"],
+ content,
+ expected_upload_cost);
- U32 everyone_perms = PERM_NONE;
- U32 group_perms = PERM_NONE;
- U32 next_owner_perms = PERM_ALL;
- if(content.has("new_next_owner_mask"))
- {
- // This is a new sim that provides creation perms so use them.
- // Do not assume we got the perms we asked for in mPostData
- // since the sim may not have granted them all.
- everyone_perms = content["new_everyone_mask"].asInteger();
- group_perms = content["new_group_mask"].asInteger();
- next_owner_perms = content["new_next_owner_mask"].asInteger();
- }
- else
- {
- // This old sim doesn't provide creation perms so use old assumption-based perms.
- if(mPostData["inventory_type"].asString() != "snapshot")
- {
- next_owner_perms = PERM_MOVE | PERM_TRANSFER;
- }
- }
- LLPermissions new_perms;
- new_perms.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null);
- new_perms.initMasks(PERM_ALL, PERM_ALL, everyone_perms, group_perms, next_owner_perms);
- S32 creation_date_now = time_corrected();
- LLPointer<LLViewerInventoryItem> item
- = new LLViewerInventoryItem(content["new_inventory_item"].asUUID(),
- mPostData["folder_id"].asUUID(),
- new_perms,
- content["new_asset"].asUUID(),
- asset_type,
- inventory_type,
- mPostData["name"].asString(),
- mPostData["description"].asString(),
- LLSaleInfo::DEFAULT,
- LLInventoryItem::II_FLAGS_NONE,
- creation_date_now);
- gInventory.updateItem(item);
- gInventory.notifyObservers();
-
- // Show the preview panel for textures and sounds to let
- // user know that the image (or snapshot) arrived intact.
- LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
- if (active_panel)
- {
- active_panel->setSelection(content["new_inventory_item"].asUUID(), TAKE_FOCUS_NO);
- if((LLAssetType::AT_TEXTURE == asset_type || LLAssetType::AT_SOUND == asset_type)
- && LLFilePicker::instance().getFileCount() <= FILE_COUNT_DISPLAY_THRESHOLD)
- {
- active_panel->openSelected();
- }
- //LLFloaterInventory::dumpSelectionInformation((void*)view);
- // restore keyboard focus
- LLFocusableElement* focus = gFocusMgr.getKeyboardFocus();
- gFocusMgr.setKeyboardFocus(focus);
- }
- }
- else
- {
- llwarns << "Can't find a folder to put it in" << llendl;
- }
+ // continue uploading for bulk uploads
- // remove the "Uploading..." message
- LLUploadDialog::modalUploadFinished();
-
// *FIX: This is a pretty big hack. What this does is check the
// file picker if there are any more pending uploads. If so,
// upload that file.
@@ -324,19 +398,42 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
// Continuing the horrible hack above, we need to extract the originally requested permissions data, if any,
// and use them for each next file to be uploaded. Note the requested perms are not the same as the
- // granted ones found in the given "content" structure but can still be found in mPostData. -MG
- U32 everyone_perms = mPostData.has("everyone_mask") ? mPostData.get("everyone_mask" ).asInteger() : PERM_NONE;
- U32 group_perms = mPostData.has("group_mask") ? mPostData.get("group_mask" ).asInteger() : PERM_NONE;
- U32 next_owner_perms = mPostData.has("next_owner_mask") ? mPostData.get("next_owner_mask").asInteger() : PERM_NONE;
+ U32 everyone_perms =
+ content.has("everyone_mask") ?
+ content["everyone_mask"].asInteger() :
+ PERM_NONE;
+
+ U32 group_perms =
+ content.has("group_mask") ?
+ content["group_mask"].asInteger() :
+ PERM_NONE;
+
+ U32 next_owner_perms =
+ content.has("next_owner_mask") ?
+ content["next_owner_mask"].asInteger() :
+ PERM_NONE;
+
std::string display_name = LLStringUtil::null;
LLAssetStorage::LLStoreAssetCallback callback = NULL;
void *userdata = NULL;
- upload_new_resource(next_file, asset_name, asset_name,
- 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
- next_owner_perms, group_perms,
- everyone_perms, display_name,
- callback, expected_upload_cost, userdata);
+
+ upload_new_resource(
+ next_file,
+ asset_name,
+ asset_name,
+ 0,
+ LLFolderType::FT_NONE,
+ LLInventoryType::IT_NONE,
+ next_owner_perms,
+ group_perms,
+ everyone_perms,
+ display_name,
+ callback,
+ LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(),
+ userdata);
}
+
+ LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, content["new_asset"], TRUE);
}
LLSendTexLayerResponder::LLSendTexLayerResponder(const LLSD& post_data,
@@ -390,17 +487,19 @@ void LLSendTexLayerResponder::error(U32 statusNum, const std::string& reason)
mBakedUploadData = NULL; // deleted in onTextureUploadComplete()
}
-LLUpdateAgentInventoryResponder::LLUpdateAgentInventoryResponder(const LLSD& post_data,
- const LLUUID& vfile_id,
- LLAssetType::EType asset_type)
-: LLAssetUploadResponder(post_data, vfile_id, asset_type)
+LLUpdateAgentInventoryResponder::LLUpdateAgentInventoryResponder(
+ const LLSD& post_data,
+ const LLUUID& vfile_id,
+ LLAssetType::EType asset_type)
+ : LLAssetUploadResponder(post_data, vfile_id, asset_type)
{
}
-LLUpdateAgentInventoryResponder::LLUpdateAgentInventoryResponder(const LLSD& post_data,
- const std::string& file_name,
- LLAssetType::EType asset_type)
-: LLAssetUploadResponder(post_data, file_name, asset_type)
+LLUpdateAgentInventoryResponder::LLUpdateAgentInventoryResponder(
+ const LLSD& post_data,
+ const std::string& file_name,
+ LLAssetType::EType asset_type)
+ : LLAssetUploadResponder(post_data, file_name, asset_type)
{
}
@@ -583,3 +682,472 @@ void LLUpdateTaskInventoryResponder::uploadComplete(const LLSD& content)
break;
}
}
+
+
+/////////////////////////////////////////////////////
+// LLNewAgentInventoryVariablePriceResponder::Impl //
+/////////////////////////////////////////////////////
+class LLNewAgentInventoryVariablePriceResponder::Impl
+{
+public:
+ Impl(
+ const LLUUID& vfile_id,
+ LLAssetType::EType asset_type,
+ const LLSD& inventory_data) :
+ mVFileID(vfile_id),
+ mAssetType(asset_type),
+ mInventoryData(inventory_data),
+ mFileName("")
+ {
+ if (!gVFS->getExists(vfile_id, asset_type))
+ {
+ llwarns
+ << "LLAssetUploadResponder called with nonexistant "
+ << "vfile_id " << vfile_id << llendl;
+ mVFileID.setNull();
+ mAssetType = LLAssetType::AT_NONE;
+ }
+ }
+
+ Impl(
+ const std::string& file_name,
+ LLAssetType::EType asset_type,
+ const LLSD& inventory_data) :
+ mFileName(file_name),
+ mAssetType(asset_type),
+ mInventoryData(inventory_data)
+ {
+ mVFileID.setNull();
+ }
+
+ std::string getFilenameOrIDString() const
+ {
+ return (mFileName.empty() ? mVFileID.asString() : mFileName);
+ }
+
+ LLUUID getVFileID() const
+ {
+ return mVFileID;
+ }
+
+ std::string getFilename() const
+ {
+ return mFileName;
+ }
+
+ LLAssetType::EType getAssetType() const
+ {
+ return mAssetType;
+ }
+
+ LLInventoryType::EType getInventoryType() const
+ {
+ return LLInventoryType::lookup(
+ mInventoryData["inventory_type"].asString());
+ }
+
+ std::string getInventoryTypeString() const
+ {
+ return mInventoryData["inventory_type"].asString();
+ }
+
+ LLUUID getFolderID() const
+ {
+ return mInventoryData["folder_id"].asUUID();
+ }
+
+ std::string getItemName() const
+ {
+ return mInventoryData["name"].asString();
+ }
+
+ std::string getItemDescription() const
+ {
+ return mInventoryData["description"].asString();
+ }
+
+ void displayCannotUploadReason(const std::string& reason)
+ {
+ LLSD args;
+ args["FILE"] = getFilenameOrIDString();
+ args["REASON"] = reason;
+
+
+ LLNotificationsUtil::add("CannotUploadReason", args);
+ LLUploadDialog::modalUploadFinished();
+ }
+
+ void onApplicationLevelError(const LLSD& error)
+ {
+ static const std::string _IDENTIFIER = "identifier";
+
+ static const std::string _INSUFFICIENT_FUNDS =
+ "NewAgentInventory_InsufficientLindenDollarBalance";
+ static const std::string _MISSING_REQUIRED_PARAMETER =
+ "NewAgentInventory_MissingRequiredParamater";
+ static const std::string _INVALID_REQUEST_BODY =
+ "NewAgentInventory_InvalidRequestBody";
+ static const std::string _RESOURCE_COST_DIFFERS =
+ "NewAgentInventory_ResourceCostDiffers";
+
+ static const std::string _MISSING_PARAMETER = "missing_parameter";
+ static const std::string _INVALID_PARAMETER = "invalid_parameter";
+ static const std::string _MISSING_RESOURCE = "missing_resource";
+ static const std::string _INVALID_RESOURCE = "invalid_resource";
+
+ // TODO* Add the other error_identifiers
+
+ std::string error_identifier = error[_IDENTIFIER].asString();
+
+ // TODO*: Pull these user visible strings from an xml file
+ // to be localized
+ if ( _INSUFFICIENT_FUNDS == error_identifier )
+ {
+ displayCannotUploadReason("You do not have a sufficient L$ balance to complete this upload.");
+ }
+ else if ( _MISSING_REQUIRED_PARAMETER == error_identifier )
+ {
+ // Missing parameters
+ if (error.has(_MISSING_PARAMETER) )
+ {
+ std::string message =
+ "Upload request was missing required parameter '[P]'";
+ LLStringUtil::replaceString(
+ message,
+ "[P]",
+ error[_MISSING_PARAMETER].asString());
+
+ displayCannotUploadReason(message);
+ }
+ else
+ {
+ std::string message =
+ "Upload request was missing a required parameter";
+ displayCannotUploadReason(message);
+ }
+ }
+ else if ( _INVALID_REQUEST_BODY == error_identifier )
+ {
+ // Invalid request body, check to see if
+ // a particular parameter was invalid
+ if ( error.has(_INVALID_PARAMETER) )
+ {
+ std::string message = "Upload parameter '[P]' is invalid.";
+ LLStringUtil::replaceString(
+ message,
+ "[P]",
+ error[_INVALID_PARAMETER].asString());
+
+ // See if the server also responds with what resource
+ // is missing.
+ if ( error.has(_MISSING_RESOURCE) )
+ {
+ message += "\nMissing resource '[R]'.";
+
+ LLStringUtil::replaceString(
+ message,
+ "[R]",
+ error[_MISSING_RESOURCE].asString());
+ }
+ else if ( error.has(_INVALID_RESOURCE) )
+ {
+ message += "\nInvalid resource '[R]'.";
+
+ LLStringUtil::replaceString(
+ message,
+ "[R]",
+ error[_INVALID_RESOURCE].asString());
+ }
+
+ displayCannotUploadReason(message);
+ }
+ else
+ {
+ std::string message = "Upload request was malformed";
+ displayCannotUploadReason(message);
+ }
+ }
+ else if ( _RESOURCE_COST_DIFFERS == error_identifier )
+ {
+ displayCannotUploadReason("The resource cost associated with this upload is not consistent with the server.");
+ }
+ else
+ {
+ displayCannotUploadReason("Unknown Error");
+ }
+ }
+
+ void onTransportError()
+ {
+ displayCannotUploadReason(
+ "The server is experiencing unexpected difficulties.");
+ }
+
+ void onTransportError(const LLSD& error)
+ {
+ static const std::string _IDENTIFIER = "identifier";
+
+ static const std::string _SERVER_ERROR_AFTER_CHARGE =
+ "NewAgentInventory_ServerErrorAfterCharge";
+
+ std::string error_identifier = error[_IDENTIFIER].asString();
+
+ // TODO*: Pull the user visible strings from an xml file
+ // to be localized
+
+ if ( _SERVER_ERROR_AFTER_CHARGE == error_identifier )
+ {
+ displayCannotUploadReason(
+ "The server is experiencing unexpected difficulties. You may have been charged for the upload.");
+ }
+ else
+ {
+ displayCannotUploadReason(
+ "The server is experiencing unexpected difficulties.");
+ }
+ }
+
+ bool uploadConfirmationCallback(
+ const LLSD& notification,
+ const LLSD& response,
+ boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder> responder)
+ {
+ S32 option;
+ std::string confirmation_url;
+
+ option = LLNotificationsUtil::getSelectedOption(
+ notification,
+ response);
+
+ confirmation_url =
+ notification["payload"]["confirmation_url"].asString();
+
+ // Yay! We are confirming or cancelling our upload
+ switch(option)
+ {
+ case 0:
+ {
+ confirmUpload(confirmation_url, responder);
+ }
+ break;
+ case 1:
+ default:
+ break;
+ }
+
+ return false;
+ }
+
+ void confirmUpload(
+ const std::string& confirmation_url,
+ boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder> responder)
+ {
+ if ( getFilename().empty() )
+ {
+ // we have no filename, use virtual file ID instead
+ LLHTTPClient::postFile(
+ confirmation_url,
+ getVFileID(),
+ getAssetType(),
+ responder);
+ }
+ else
+ {
+ LLHTTPClient::postFile(
+ confirmation_url,
+ getFilename(),
+ responder);
+ }
+ }
+
+
+private:
+ std::string mFileName;
+
+ LLSD mInventoryData;
+ LLAssetType::EType mAssetType;
+ LLUUID mVFileID;
+};
+
+///////////////////////////////////////////////
+// LLNewAgentInventoryVariablePriceResponder //
+///////////////////////////////////////////////
+LLNewAgentInventoryVariablePriceResponder::LLNewAgentInventoryVariablePriceResponder(
+ const LLUUID& vfile_id,
+ LLAssetType::EType asset_type,
+ const LLSD& inventory_info)
+{
+ mImpl = new Impl(
+ vfile_id,
+ asset_type,
+ inventory_info);
+}
+
+LLNewAgentInventoryVariablePriceResponder::LLNewAgentInventoryVariablePriceResponder(
+ const std::string& file_name,
+ LLAssetType::EType asset_type,
+ const LLSD& inventory_info)
+{
+ mImpl = new Impl(
+ file_name,
+ asset_type,
+ inventory_info);
+}
+
+LLNewAgentInventoryVariablePriceResponder::~LLNewAgentInventoryVariablePriceResponder()
+{
+ delete mImpl;
+}
+
+void LLNewAgentInventoryVariablePriceResponder::errorWithContent(
+ U32 statusNum,
+ const std::string& reason,
+ const LLSD& content)
+{
+ lldebugs
+ << "LLNewAgentInventoryVariablePrice::error " << statusNum
+ << " reason: " << reason << llendl;
+
+ if ( content.has("error") )
+ {
+ static const std::string _ERROR = "error";
+
+ mImpl->onTransportError(content[_ERROR]);
+ }
+ else
+ {
+ mImpl->onTransportError();
+ }
+}
+
+void LLNewAgentInventoryVariablePriceResponder::result(const LLSD& content)
+{
+ // Parse out application level errors and the appropriate
+ // responses for them
+ static const std::string _ERROR = "error";
+ static const std::string _STATE = "state";
+
+ static const std::string _COMPLETE = "complete";
+ static const std::string _CONFIRM_UPLOAD = "confirm_upload";
+
+ static const std::string _UPLOAD_PRICE = "upload_price";
+ static const std::string _RESOURCE_COST = "resource_cost";
+ static const std::string _RSVP = "rsvp";
+
+ // Check for application level errors
+ if ( content.has(_ERROR) )
+ {
+ onApplicationLevelError(content[_ERROR]);
+ return;
+ }
+
+ std::string state = content[_STATE];
+ LLAssetType::EType asset_type = mImpl->getAssetType();
+
+ if ( _COMPLETE == state )
+ {
+ // rename file in VFS with new asset id
+ if (mImpl->getFilename().empty())
+ {
+ // rename the file in the VFS to the actual asset id
+ // llinfos << "Changing uploaded asset UUID to " << content["new_asset"].asUUID() << llendl;
+ gVFS->renameFile(
+ mImpl->getVFileID(),
+ asset_type,
+ content["new_asset"].asUUID(),
+ asset_type);
+ }
+
+ on_new_single_inventory_upload_complete(
+ asset_type,
+ mImpl->getInventoryType(),
+ mImpl->getInventoryTypeString(),
+ mImpl->getFolderID(),
+ mImpl->getItemName(),
+ mImpl->getItemDescription(),
+ content,
+ content[_UPLOAD_PRICE].asInteger());
+
+ // TODO* Add bulk (serial) uploading or add
+ // a super class of this that does so
+ }
+ else if ( _CONFIRM_UPLOAD == state )
+ {
+ showConfirmationDialog(
+ content[_UPLOAD_PRICE].asInteger(),
+ content[_RESOURCE_COST].asInteger(),
+ content[_RSVP].asString());
+ }
+ else
+ {
+ onApplicationLevelError("");
+ }
+}
+
+void LLNewAgentInventoryVariablePriceResponder::onApplicationLevelError(
+ const LLSD& error)
+{
+ mImpl->onApplicationLevelError(error);
+}
+
+void LLNewAgentInventoryVariablePriceResponder::showConfirmationDialog(
+ S32 upload_price,
+ S32 resource_cost,
+ const std::string& confirmation_url)
+{
+ if ( 0 == upload_price )
+ {
+ // don't show confirmation dialog for free uploads, I mean,
+ // they're free!
+
+ // The creating of a new instrusive_ptr(this)
+ // creates a new boost::intrusive_ptr
+ // which is a copy of this. This code is required because
+ // 'this' is always of type Class* and not the intrusive_ptr,
+ // and thus, a reference to 'this' is not registered
+ // by using just plain 'this'.
+
+ // Since LLNewAgentInventoryVariablePriceResponder is a
+ // reference counted class, it is possible (since the
+ // reference to a plain 'this' would be missed here) that,
+ // when using plain ol' 'this', that this object
+ // would be deleted before the callback is triggered
+ // and cause sadness.
+ mImpl->confirmUpload(
+ confirmation_url,
+ boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder>(this));
+ }
+ else
+ {
+ LLSD substitutions;
+ LLSD payload;
+
+ substitutions["PRICE"] = upload_price;
+
+ payload["confirmation_url"] = confirmation_url;
+
+ // The creating of a new instrusive_ptr(this)
+ // creates a new boost::intrusive_ptr
+ // which is a copy of this. This code is required because
+ // 'this' is always of type Class* and not the intrusive_ptr,
+ // and thus, a reference to 'this' is not registered
+ // by using just plain 'this'.
+
+ // Since LLNewAgentInventoryVariablePriceResponder is a
+ // reference counted class, it is possible (since the
+ // reference to a plain 'this' would be missed here) that,
+ // when using plain ol' 'this', that this object
+ // would be deleted before the callback is triggered
+ // and cause sadness.
+ LLNotificationsUtil::add(
+ "UploadCostConfirmation",
+ substitutions,
+ payload,
+ boost::bind(
+ &LLNewAgentInventoryVariablePriceResponder::Impl::uploadConfirmationCallback,
+ mImpl,
+ _1,
+ _2,
+ boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder>(this)));
+ }
+}
diff --git a/indra/newview/llassetuploadresponders.h b/indra/newview/llassetuploadresponders.h
index e656351305..c869988203 100644
--- a/indra/newview/llassetuploadresponders.h
+++ b/indra/newview/llassetuploadresponders.h
@@ -61,15 +61,60 @@ protected:
std::string mFileName;
};
+
+// TODO*: Remove this once deprecated
class LLNewAgentInventoryResponder : public LLAssetUploadResponder
{
public:
- LLNewAgentInventoryResponder(const LLSD& post_data,
- const LLUUID& vfile_id,
- LLAssetType::EType asset_type);
- LLNewAgentInventoryResponder(const LLSD& post_data, const std::string& file_name,
- LLAssetType::EType asset_type);
+ LLNewAgentInventoryResponder(
+ const LLSD& post_data,
+ const LLUUID& vfile_id,
+ LLAssetType::EType asset_type);
+ LLNewAgentInventoryResponder(
+ const LLSD& post_data,
+ const std::string& file_name,
+ LLAssetType::EType asset_type);
+ virtual void error(U32 statusNum, const std::string& reason);
virtual void uploadComplete(const LLSD& content);
+ virtual void uploadFailure(const LLSD& content);
+};
+
+// A base class which goes through and performs some default
+// actions for variable price uploads. If more specific actions
+// are needed (such as different confirmation messages, etc.)
+// the functions onApplicationLevelError and showConfirmationDialog.
+class LLNewAgentInventoryVariablePriceResponder :
+ public LLHTTPClient::Responder
+{
+public:
+ LLNewAgentInventoryVariablePriceResponder(
+ const LLUUID& vfile_id,
+ LLAssetType::EType asset_type,
+ const LLSD& inventory_info);
+
+ LLNewAgentInventoryVariablePriceResponder(
+ const std::string& file_name,
+ LLAssetType::EType asset_type,
+ const LLSD& inventory_info);
+
+ virtual ~LLNewAgentInventoryVariablePriceResponder();
+
+ void errorWithContent(
+ U32 statusNum,
+ const std::string& reason,
+ const LLSD& content);
+ void result(const LLSD& content);
+
+ virtual void onApplicationLevelError(
+ const LLSD& error);
+ virtual void showConfirmationDialog(
+ S32 upload_price,
+ S32 resource_cost,
+ const std::string& confirmation_url);
+
+private:
+ class Impl;
+ Impl* mImpl;
};
class LLBakedUploadData;
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index bd987eac77..1d75374930 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -181,7 +181,12 @@ void LLAvatarActions::startIM(const LLUUID& id)
return;
std::string name;
- gCacheName->getFullName(id, name);
+ if (!gCacheName->getFullName(id, name))
+ {
+ gCacheName->get(id, FALSE, boost::bind(&LLAvatarActions::startIM, id));
+ return;
+ }
+
LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id);
if (session_id != LLUUID::null)
{
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 4c8cec3d30..93b708f299 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -80,6 +80,14 @@ public:
{
mNearbyChatBar = getChild<LLNearbyChatBar>("chat_bar");
mGesturePanel = getChild<LLPanel>("gesture_panel");
+
+ // Hide "show_nearby_chat" button
+ LLLineEditor* chat_box = mNearbyChatBar->getChatBox();
+ LLUICtrl* show_btn = mNearbyChatBar->getChild<LLUICtrl>("show_nearby_chat");
+ S32 delta_width = show_btn->getRect().getWidth();
+ show_btn->setVisible(FALSE);
+ chat_box->reshape(chat_box->getRect().getWidth() + delta_width, chat_box->getRect().getHeight());
+
return TRUE;
}
@@ -433,6 +441,8 @@ BOOL LLBottomTray::postBuild()
mObjectDefaultWidthMap[RS_BUTTON_CAMERA] = mCamPanel->getRect().getWidth();
mObjectDefaultWidthMap[RS_BUTTON_SPEAK] = mSpeakPanel->getRect().getWidth();
+ mNearbyChatBar->getChatBox()->setContextMenu(NULL);
+
return TRUE;
}
diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
index bd4fae6ab6..76e058a1c3 100644
--- a/indra/newview/llcallfloater.cpp
+++ b/indra/newview/llcallfloater.cpp
@@ -303,8 +303,10 @@ void LLCallFloater::updateSession()
refreshParticipantList();
updateAgentModeratorState();
- //show floater for voice calls
- if (!is_local_chat)
+ //show floater for voice calls & only in CONNECTED to voice channel state
+ if (!is_local_chat &&
+ voice_channel &&
+ LLVoiceChannel::STATE_CONNECTED == voice_channel->getState())
{
LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
bool show_me = !(im_floater && im_floater->getVisible());
@@ -333,6 +335,7 @@ void LLCallFloater::refreshParticipantList()
{
mParticipants = new LLParticipantList(mSpeakerManager, mAvatarList, true, mVoiceType != VC_GROUP_CHAT && mVoiceType != VC_AD_HOC_CHAT);
mParticipants->setValidateSpeakerCallback(boost::bind(&LLCallFloater::validateSpeaker, this, _1));
+ mParticipants->setSortOrder(LLParticipantList::E_SORT_BY_RECENT_SPEAKERS);
if (LLLocalSpeakerMgr::getInstance() == mSpeakerManager)
{
@@ -678,8 +681,7 @@ void LLCallFloater::resetVoiceRemoveTimers()
void LLCallFloater::removeVoiceRemoveTimer(const LLUUID& voice_speaker_id)
{
- bool delete_it = true;
- mSpeakerDelayRemover->unsetActionTimer(voice_speaker_id, delete_it);
+ mSpeakerDelayRemover->unsetActionTimer(voice_speaker_id);
}
bool LLCallFloater::validateSpeaker(const LLUUID& speaker_id)
@@ -721,7 +723,15 @@ void LLCallFloater::connectToChannel(LLVoiceChannel* channel)
void LLCallFloater::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
{
- updateState(new_state);
+ // check is voice operational and if it doesn't work hide VCP (EXT-4397)
+ if(LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking())
+ {
+ updateState(new_state);
+ }
+ else
+ {
+ closeFloater();
+ }
}
void LLCallFloater::updateState(const LLVoiceChannel::EState& new_state)
@@ -750,18 +760,26 @@ void LLCallFloater::reset(const LLVoiceChannel::EState& new_state)
mParticipants = NULL;
mAvatarList->clear();
- // "loading" is shown in parcel with disabled voice only when state is "ringing"
- // to avoid showing it in nearby chat vcp all the time- "no_one_near" is now shown there (EXT-4648)
- bool show_loading = LLVoiceChannel::STATE_RINGING == new_state;
- if(!show_loading && !LLViewerParcelMgr::getInstance()->allowAgentVoice() && mVoiceType == VC_LOCAL_CHAT)
+ // These ifs were added instead of simply showing "loading" to make VCP work correctly in parcels
+ // with disabled voice (EXT-4648 and EXT-4649)
+ if (!LLViewerParcelMgr::getInstance()->allowAgentVoice() && LLVoiceChannel::STATE_HUNG_UP == new_state)
{
+ // hides "Leave Call" when call is ended in parcel with disabled voice- hiding usually happens in
+ // updateSession() which won't be called here because connect to nearby voice never happens
+ childSetVisible("leave_call_btn_panel", false);
+ // setting title to nearby chat an "no one near..." text- because in region with disabled
+ // voice we won't have chance to really connect to nearby, so VCP is changed here manually
+ setTitle(getString("title_nearby"));
mAvatarList->setNoItemsCommentText(getString("no_one_near"));
}
- else
+ // "loading" is shown only when state is "ringing" to avoid showing it in nearby chat vcp
+ // of parcels with disabled voice all the time- "no_one_near" is now shown there (EXT-4648)
+ else if (new_state == LLVoiceChannel::STATE_RINGING)
{
// update floater to show Loading while waiting for data.
mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData"));
}
+
mAvatarList->setVisible(TRUE);
mNonAvatarCaller->setVisible(FALSE);
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index d988770f90..c3bda26aac 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -56,12 +56,14 @@
#include "llnotifications.h"
#include "llnotificationsutil.h"
#include "llresmgr.h"
+#include "llslurl.h"
#include "llimview.h"
#include "llviewercontrol.h"
#include "llviewernetwork.h"
#include "llviewerobjectlist.h"
#include "llviewerwindow.h"
#include "llvoavatar.h"
+#include "llavataractions.h"
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
@@ -689,13 +691,8 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
setBuddyOnline(agent_id,online);
if(chat_notify)
{
- std::string first, last;
- if(gCacheName->getName(agent_id, first, last))
- {
- notify = TRUE;
- args["FIRST"] = first;
- args["LAST"] = last;
- }
+ notify = TRUE;
+ args["NAME_SLURL"] = LLSLURL::buildCommand("agent", agent_id, "about");
}
}
else
@@ -715,7 +712,21 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
if(notify)
{
// Popup a notify box with online status of this agent
- LLNotificationPtr notification = LLNotificationsUtil::add(online ? "FriendOnline" : "FriendOffline", args);
+ LLNotificationPtr notification;
+
+ if (online)
+ {
+ notification =
+ LLNotificationsUtil::add("FriendOnline",
+ args,
+ LLSD().with("respond_on_mousedown", TRUE),
+ boost::bind(&LLAvatarActions::startIM, agent_id));
+ }
+ else
+ {
+ notification =
+ LLNotificationsUtil::add("FriendOffline", args);
+ }
// If there's an open IM session with this agent, send a notification there too.
LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, agent_id);
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index f046e08827..9368d9cb7c 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -66,6 +66,8 @@ static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history");
const static std::string NEW_LINE(rawstr_to_utf8("\n"));
+const static U32 LENGTH_OF_TIME_STR = std::string("12:00").length();
+
// support for secondlife:///app/objectim/{UUID}/ SLapps
class LLObjectIMHandler : public LLCommandHandler
{
@@ -116,7 +118,7 @@ public:
//*TODO remake it using mouse enter/leave and static LLHandle<LLIconCtrl> to add/remove as a child
BOOL handleToolTip(S32 x, S32 y, MASK mask)
{
- LLViewerTextEditor* name = getChild<LLViewerTextEditor>("user_name");
+ LLTextBase* name = getChild<LLTextBase>("user_name");
if (name && name->parentPointInView(x, y) && mAvatarID.notNull() && SYSTEM_FROM != mFrom)
{
@@ -257,27 +259,25 @@ public:
mSessionID = chat.mSessionID;
mSourceType = chat.mSourceType;
gCacheName->get(mAvatarID, FALSE, boost::bind(&LLChatHistoryHeader::nameUpdatedCallback, this, _1, _2, _3, _4));
- if(chat.mFromID.isNull())
+
+ //*TODO overly defensive thing, source type should be maintained out there
+ if(chat.mFromID.isNull() || chat.mFromName == SYSTEM_FROM)
{
mSourceType = CHAT_SOURCE_SYSTEM;
}
- LLTextEditor* userName = getChild<LLTextEditor>("user_name");
+ LLTextBox* userName = getChild<LLTextBox>("user_name");
userName->setReadOnlyColor(style_params.readonly_color());
userName->setColor(style_params.color());
- if(!chat.mFromName.empty())
+ userName->setValue(chat.mFromName);
+ if (chat.mFromName.empty() || CHAT_SOURCE_SYSTEM == mSourceType)
{
- userName->setValue(chat.mFromName);
- mFrom = chat.mFromName;
- }
- else
- {
- std::string SL = LLTrans::getString("SECOND_LIFE");
- userName->setValue(SL);
+ userName->setValue(LLTrans::getString("SECOND_LIFE"));
}
+
mMinUserNameWidth = style_params.font()->getWidth(userName->getWText().c_str()) + PADDING;
setTimeField(chat);
@@ -287,20 +287,22 @@ public:
if(mSourceType != CHAT_SOURCE_AGENT)
icon->setDrawTooltip(false);
- if(!chat.mFromID.isNull())
+ switch (mSourceType)
{
- icon->setValue(chat.mFromID);
+ case CHAT_SOURCE_AGENT:
+ icon->setValue(chat.mFromID);
+ break;
+ case CHAT_SOURCE_OBJECT:
+ icon->setValue(LLSD("OBJECT_Icon"));
+ break;
+ case CHAT_SOURCE_SYSTEM:
+ icon->setValue(LLSD("SL_Logo"));
}
- else if (userName->getValue().asString()==LLTrans::getString("SECOND_LIFE"))
- {
- icon->setValue(LLSD("SL_Logo"));
- }
-
}
/*virtual*/ void draw()
{
- LLTextEditor* user_name = getChild<LLTextEditor>("user_name");
+ LLTextBox* user_name = getChild<LLTextBox>("user_name");
LLTextBox* time_box = getChild<LLTextBox>("time_box");
LLRect user_name_rect = user_name->getRect();
@@ -444,6 +446,7 @@ LLChatHistory::LLChatHistory(const LLChatHistory::Params& p)
editor_params.rect = getLocalRect();
editor_params.follows.flags = FOLLOWS_ALL;
editor_params.enabled = false; // read only
+ editor_params.show_context_menu = "true";
mEditor = LLUICtrlFactory::create<LLTextEditor>(editor_params, this);
}
@@ -538,6 +541,7 @@ void LLChatHistory::clear()
void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LLStyle::Params& input_append_params)
{
bool use_plain_text_chat_history = args["use_plain_text_chat_history"].asBoolean();
+
if (!mEditor->scrolledToEnd() && chat.mFromID != gAgent.getID() && !chat.mFromName.empty())
{
mUnreadChatSources.insert(chat.mFromName);
@@ -603,6 +607,14 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
style_params.font.style = "ITALIC";
}
+ //*HACK we graying out chat history by graying out messages that contains full date in a time string
+ bool message_from_log = chat.mTimeStr.length() > LENGTH_OF_TIME_STR;
+ if (message_from_log)
+ {
+ style_params.color(LLColor4::grey);
+ style_params.readonly_color(LLColor4::grey);
+ }
+
if (use_plain_text_chat_history)
{
mEditor->appendText("[" + chat.mTimeStr + "] ", mEditor->getText().size() != 0, style_params);
@@ -638,10 +650,10 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
mEditor->appendText("<nolink>" + chat.mFromName + "</nolink>" + delimiter,
false, link_params);
}
- else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() )
+ else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() && !message_from_log)
{
LLStyle::Params link_params(style_params);
- link_params.fillFrom(LLStyleMap::instance().lookupAgent(chat.mFromID));
+ link_params.overwriteFrom(LLStyleMap::instance().lookupAgent(chat.mFromID));
// Convert the name to a hotlink and add to message.
mEditor->appendText(chat.mFromName + delimiter, false, link_params);
}
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index f772aea4bd..e164aa8fc4 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -321,7 +321,10 @@ void LLNearbyChatToastPanel::draw()
if(icon)
{
icon->setDrawTooltip(mSourceType == CHAT_SOURCE_AGENT);
- icon->setValue(mFromID);
+ if(mSourceType == CHAT_SOURCE_AGENT)
+ icon->setValue(mFromID);
+ else
+ icon->setValue(LLSD("OBJECT_Icon"));
}
mIsDirty = false;
}
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index f646bcccb5..8efa814a2e 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -36,6 +36,7 @@
#include "llagent.h"
#include "llavataractions.h"
#include "llbottomtray.h"
+#include "lleventtimer.h"
#include "llgroupactions.h"
#include "lliconctrl.h"
#include "llimfloater.h"
@@ -545,6 +546,7 @@ void LLIMChiclet::toggleSpeakerControl()
}
setRequiredWidth();
+ mSpeakerCtrl->setSpeakerId(LLUUID::null);
mSpeakerCtrl->setVisible(getShowSpeaker());
}
@@ -954,7 +956,10 @@ LLIMGroupChiclet::~LLIMGroupChiclet()
void LLIMGroupChiclet::draw()
{
- switchToCurrentSpeaker();
+ if(getShowSpeaker())
+ {
+ switchToCurrentSpeaker();
+ }
LLIMChiclet::draw();
}
@@ -1154,10 +1159,10 @@ void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){
void object_chiclet_callback(const LLSD& data)
{
- LLUUID object_id = data["object_id"];
+ LLUUID notification_id = data["notification_id"];
bool new_message = data["new_message"];
- std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(object_id);
+ std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(notification_id);
std::list<LLChiclet *>::iterator iter;
for (iter = chiclets.begin(); iter != chiclets.end(); iter++)
{
@@ -1889,12 +1894,8 @@ void LLScriptChiclet::setSessionId(const LLUUID& session_id)
setShowNewMessagesIcon( getSessionId() != session_id );
LLIMChiclet::setSessionId(session_id);
- LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(session_id);
- LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
- if(notification)
- {
- setToolTip(notification->getSubstitutions()["TITLE"].asString());
- }
+
+ setToolTip(LLScriptFloaterManager::getObjectName(session_id));
}
void LLScriptChiclet::setCounter(S32 counter)
@@ -1943,13 +1944,10 @@ void LLInvOfferChiclet::setSessionId(const LLUUID& session_id)
{
setShowNewMessagesIcon( getSessionId() != session_id );
+ setToolTip(LLScriptFloaterManager::getObjectName(session_id));
+
LLIMChiclet::setSessionId(session_id);
- LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(session_id);
- LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
- if(notification)
- {
- setToolTip(notification->getSubstitutions()["TITLE"].asString());
- }
+ LLNotificationPtr notification = LLNotifications::getInstance()->find(session_id);
if ( notification && notification->getName() == INVENTORY_USER_OFFER )
{
diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp
index 00c05445e1..be6c15eab4 100644
--- a/indra/newview/llcurrencyuimanager.cpp
+++ b/indra/newview/llcurrencyuimanager.cpp
@@ -426,7 +426,7 @@ void LLCurrencyUIManager::Impl::prepare()
LLLineEditor* lindenAmount = mPanel.getChild<LLLineEditor>("currency_amt");
if (lindenAmount)
{
- lindenAmount->setPrevalidate(LLLineEditor::prevalidateNonNegativeS32);
+ lindenAmount->setPrevalidate(LLTextValidate::validateNonNegativeS32);
lindenAmount->setKeystrokeCallback(onCurrencyKey, this);
}
}
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index 244fed791f..390e950d75 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -189,20 +189,30 @@ BOOL LLDrawable::isLight() const
}
}
+static LLFastTimer::DeclareTimer FTM_CLEANUP_DRAWABLE("Cleanup Drawable");
+static LLFastTimer::DeclareTimer FTM_DEREF_DRAWABLE("Deref");
+static LLFastTimer::DeclareTimer FTM_DELETE_FACES("Faces");
+
void LLDrawable::cleanupReferences()
{
- LLFastTimer t(FTM_PIPELINE);
+ LLFastTimer t(FTM_CLEANUP_DRAWABLE);
- std::for_each(mFaces.begin(), mFaces.end(), DeletePointer());
- mFaces.clear();
+ {
+ LLFastTimer t(FTM_DELETE_FACES);
+ std::for_each(mFaces.begin(), mFaces.end(), DeletePointer());
+ mFaces.clear();
+ }
gObjectList.removeDrawable(this);
gPipeline.unlinkDrawable(this);
- // Cleanup references to other objects
- mVObjp = NULL;
- mParent = NULL;
+ {
+ LLFastTimer t(FTM_DEREF_DRAWABLE);
+ // Cleanup references to other objects
+ mVObjp = NULL;
+ mParent = NULL;
+ }
}
void LLDrawable::cleanupDeadDrawables()
@@ -1046,9 +1056,13 @@ LLSpatialBridge::LLSpatialBridge(LLDrawable* root, BOOL render_by_group, U32 dat
llassert(mDrawable);
llassert(mDrawable->getRegion());
- llassert(mDrawable->getRegion()->getSpatialPartition(mPartitionType));
+ LLSpatialPartition *part = mDrawable->getRegion()->getSpatialPartition(mPartitionType);
+ llassert(part);
- mDrawable->getRegion()->getSpatialPartition(mPartitionType)->put(this);
+ if (part)
+ {
+ part->put(this);
+ }
}
LLSpatialBridge::~LLSpatialBridge()
@@ -1364,10 +1378,14 @@ BOOL LLSpatialBridge::updateMove()
{
llassert(mDrawable);
llassert(mDrawable->getRegion());
- llassert(mDrawable->getRegion()->getSpatialPartition(mPartitionType));
+ LLSpatialPartition* part = mDrawable->getRegion()->getSpatialPartition(mPartitionType);
+ llassert(part);
mOctree->balance();
- mDrawable->getRegion()->getSpatialPartition(mPartitionType)->move(this, getSpatialGroup(), TRUE);
+ if (part)
+ {
+ part->move(this, getSpatialGroup(), TRUE);
+ }
return TRUE;
}
diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h
index 651dabff9e..c3c6cbe12f 100644
--- a/indra/newview/lldrawable.h
+++ b/indra/newview/lldrawable.h
@@ -313,8 +313,10 @@ private:
inline LLFace* LLDrawable::getFace(const S32 i) const
{
- llassert((U32)i < mFaces.size());
- llassert(mFaces[i]);
+ if ((U32) i >= mFaces.size())
+ {
+ return NULL;
+ }
return mFaces[i];
}
diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp
index 95ddacb722..ef946ac49e 100644
--- a/indra/newview/lldrawpool.cpp
+++ b/indra/newview/lldrawpool.cpp
@@ -496,8 +496,8 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
params.mGroup->rebuildMesh();
}
params.mVertexBuffer->setBuffer(mask);
- params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
- gPipeline.addTrianglesDrawn(params.mCount/3);
+ params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset);
+ gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
}
if (params.mTextureMatrix && texture && params.mTexture.notNull())
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index 6d77361414..875c9ac6a9 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -180,6 +180,7 @@ void LLDrawPoolAlpha::render(S32 pass)
if (LLPipeline::sFastAlpha && !deferred_render)
{
+ LLGLDisable blend_disable(GL_BLEND);
gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.33f);
if (mVertexShaderLevel > 0)
{
@@ -250,8 +251,8 @@ void LLDrawPoolAlpha::renderAlphaHighlight(U32 mask)
params.mGroup->rebuildMesh();
}
params.mVertexBuffer->setBuffer(mask);
- params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
- gPipeline.addTrianglesDrawn(params.mCount/3);
+ params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset);
+ gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
}
}
}
@@ -380,8 +381,8 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
}
params.mVertexBuffer->setBuffer(mask);
- params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
- gPipeline.addTrianglesDrawn(params.mCount/3);
+ params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset);
+ gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
if (params.mTextureMatrix && params.mTexture.notNull())
{
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 03a8b108e2..a4a8dc80b5 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -560,8 +560,8 @@ void LLDrawPoolBump::renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL
params.mGroup->rebuildMesh();
}
params.mVertexBuffer->setBuffer(mask);
- params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
- gPipeline.addTrianglesDrawn(params.mCount/3);
+ params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset);
+ gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
}
}
@@ -701,6 +701,18 @@ void LLDrawPoolBump::endBump()
gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
+S32 LLDrawPoolBump::getNumDeferredPasses()
+{
+ if (gSavedSettings.getBOOL("RenderObjectBump"))
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
void LLDrawPoolBump::beginDeferredPass(S32 pass)
{
if (!gPipeline.hasRenderBatches(LLRenderPass::PASS_BUMP))
@@ -1231,8 +1243,8 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
params.mGroup->rebuildMesh();
}
params.mVertexBuffer->setBuffer(mask);
- params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
- gPipeline.addTrianglesDrawn(params.mCount/3);
+ params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset);
+ gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
if (params.mTextureMatrix)
{
if (mShiny)
diff --git a/indra/newview/lldrawpoolbump.h b/indra/newview/lldrawpoolbump.h
index bf940cf1e4..2019f1df26 100644
--- a/indra/newview/lldrawpoolbump.h
+++ b/indra/newview/lldrawpoolbump.h
@@ -79,7 +79,7 @@ public:
void renderBump();
void endBump();
- virtual S32 getNumDeferredPasses() { return 1; }
+ virtual S32 getNumDeferredPasses();
/*virtual*/ void beginDeferredPass(S32 pass);
/*virtual*/ void endDeferredPass(S32 pass);
/*virtual*/ void renderDeferred(S32 pass);
diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp
index 5521fb05a8..1a5d55d793 100644
--- a/indra/newview/lldrawpooltree.cpp
+++ b/indra/newview/lldrawpooltree.cpp
@@ -115,7 +115,7 @@ void LLDrawPoolTree::render(S32 pass)
LLFace *face = *iter;
face->mVertexBuffer->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
face->mVertexBuffer->drawRange(LLRender::TRIANGLES, 0, face->mVertexBuffer->getRequestedVerts()-1, face->mVertexBuffer->getRequestedIndices(), 0);
- gPipeline.addTrianglesDrawn(face->mVertexBuffer->getRequestedIndices()/3);
+ gPipeline.addTrianglesDrawn(face->mVertexBuffer->getRequestedIndices());
}
}
}
@@ -237,7 +237,7 @@ void LLDrawPoolTree::renderForSelect()
face->mVertexBuffer->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
face->mVertexBuffer->drawRange(LLRender::TRIANGLES, 0, face->mVertexBuffer->getRequestedVerts()-1, face->mVertexBuffer->getRequestedIndices(), 0);
- gPipeline.addTrianglesDrawn(face->mVertexBuffer->getRequestedIndices()/3);
+ gPipeline.addTrianglesDrawn(face->mVertexBuffer->getRequestedIndices());
}
}
}
diff --git a/indra/newview/lldriverparam.cpp b/indra/newview/lldriverparam.cpp
index 8ebfa471f3..830e975e8a 100644
--- a/indra/newview/lldriverparam.cpp
+++ b/indra/newview/lldriverparam.cpp
@@ -432,6 +432,12 @@ const LLVector3* LLDriverParam::getNextDistortion(U32 *index, LLPolyMesh **poly_
}
}
+ llassert(driven);
+ if (!driven)
+ {
+ return NULL; // shouldn't happen, but...
+ }
+
// We're already in the middle of a param's distortions, so get the next one.
const LLVector3* v = driven->mParam->getNextDistortion( index, poly_mesh );
if( (!v) && (iter != mDriven.end()) )
diff --git a/indra/newview/lleventpoll.cpp b/indra/newview/lleventpoll.cpp
index eca9f8aba2..cc4e1a1868 100644
--- a/indra/newview/lleventpoll.cpp
+++ b/indra/newview/lleventpoll.cpp
@@ -39,7 +39,7 @@
#include "llhttpclient.h"
#include "llhttpstatuscodes.h"
#include "llsdserialize.h"
-#include "lltimer.h"
+#include "lleventtimer.h"
#include "llviewerregion.h"
#include "message.h"
#include "lltrans.h"
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 965ac1cad0..c40edb6511 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -182,24 +182,36 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
mAtlasInfop = NULL ;
mUsingAtlas = FALSE ;
+ mHasMedia = FALSE ;
}
+static LLFastTimer::DeclareTimer FTM_DESTROY_FACE("Destroy Face");
+static LLFastTimer::DeclareTimer FTM_DESTROY_TEXTURE("Texture");
+static LLFastTimer::DeclareTimer FTM_DESTROY_DRAWPOOL("Drawpool");
+static LLFastTimer::DeclareTimer FTM_DESTROY_TEXTURE_MATRIX("Texture Matrix");
+static LLFastTimer::DeclareTimer FTM_DESTROY_DRAW_INFO("Draw Info");
+static LLFastTimer::DeclareTimer FTM_DESTROY_ATLAS("Atlas");
+static LLFastTimer::DeclareTimer FTM_FACE_DEREF("Deref");
void LLFace::destroy()
{
+ LLFastTimer t(FTM_DESTROY_FACE);
if(mTexture.notNull())
{
+ LLFastTimer t(FTM_DESTROY_TEXTURE);
mTexture->removeFace(this) ;
}
if (mDrawPoolp)
{
+ LLFastTimer t(FTM_DESTROY_DRAWPOOL);
mDrawPoolp->removeFace(this);
mDrawPoolp = NULL;
}
if (mTextureMatrix)
{
+ LLFastTimer t(FTM_DESTROY_TEXTURE_MATRIX);
delete mTextureMatrix;
mTextureMatrix = NULL;
@@ -214,11 +226,21 @@ void LLFace::destroy()
}
}
- setDrawInfo(NULL);
+ {
+ LLFastTimer t(FTM_DESTROY_DRAW_INFO);
+ setDrawInfo(NULL);
+ }
+
+ {
+ LLFastTimer t(FTM_DESTROY_ATLAS);
+ removeAtlas();
+ }
- removeAtlas();
- mDrawablep = NULL;
- mVObjp = NULL;
+ {
+ LLFastTimer t(FTM_FACE_DEREF);
+ mDrawablep = NULL;
+ mVObjp = NULL;
+ }
}
@@ -301,7 +323,8 @@ void LLFace::switchTexture(LLViewerTexture* new_texture)
if(!new_texture)
{
- llerrs << "Can not switch to a null texture." << llendl ;
+ llerrs << "Can not switch to a null texture." << llendl;
+ return;
}
new_texture->addTextureStats(mTexture->getMaxVirtualSize()) ;
@@ -868,7 +891,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
llpushcallstacks ;
const LLVolumeFace &vf = volume.getVolumeFace(f);
S32 num_vertices = (S32)vf.mVertices.size();
- S32 num_indices = (S32)vf.mIndices.size();
+ S32 num_indices = LLPipeline::sUseTriStrips ? (S32)vf.mTriStrip.size() : (S32) vf.mIndices.size();
if (mVertexBuffer.notNull())
{
@@ -1040,17 +1063,20 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
if (rebuild_color)
{
- GLfloat alpha[4] =
- {
- 0.00f,
- 0.25f,
- 0.5f,
- 0.75f
- };
-
- if (getPoolType() != LLDrawPool::POOL_ALPHA && (LLPipeline::sRenderDeferred || (LLPipeline::sRenderBump && tep->getShiny())))
+ if (tep)
{
- color.mV[3] = U8 (alpha[tep->getShiny()] * 255);
+ GLfloat alpha[4] =
+ {
+ 0.00f,
+ 0.25f,
+ 0.5f,
+ 0.75f
+ };
+
+ if (getPoolType() != LLDrawPool::POOL_ALPHA && (LLPipeline::sRenderDeferred || (LLPipeline::sRenderBump && tep->getShiny())))
+ {
+ color.mV[3] = U8 (alpha[tep->getShiny()] * 255);
+ }
}
}
@@ -1058,9 +1084,19 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
if (full_rebuild)
{
mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex);
- for (U16 i = 0; i < num_indices; i++)
+ if (LLPipeline::sUseTriStrips)
+ {
+ for (U32 i = 0; i < num_indices; i++)
+ {
+ *indicesp++ = vf.mTriStrip[i] + index_offset;
+ }
+ }
+ else
{
- *indicesp++ = vf.mIndices[i] + index_offset;
+ for (U32 i = 0; i < num_indices; i++)
+ {
+ *indicesp++ = vf.mIndices[i] + index_offset;
+ }
}
}
@@ -1323,17 +1359,33 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
return TRUE;
}
+//check if the face has a media
+BOOL LLFace::hasMedia() const
+{
+ if(mHasMedia)
+ {
+ return TRUE ;
+ }
+ if(mTexture.notNull())
+ {
+ return mTexture->hasParcelMedia() ; //if has a parcel media
+ }
+
+ return FALSE ; //no media.
+}
+
const F32 LEAST_IMPORTANCE = 0.05f ;
const F32 LEAST_IMPORTANCE_FOR_LARGE_IMAGE = 0.3f ;
F32 LLFace::getTextureVirtualSize()
{
F32 radius;
- F32 cos_angle_to_view_dir;
- mPixelArea = calcPixelArea(cos_angle_to_view_dir, radius);
+ F32 cos_angle_to_view_dir;
+ BOOL in_frustum = calcPixelArea(cos_angle_to_view_dir, radius);
- if (mPixelArea <= 0)
+ if (mPixelArea < 0.0001f || !in_frustum)
{
+ setVirtualSize(0.f) ;
return 0.f;
}
@@ -1370,23 +1422,48 @@ F32 LLFace::getTextureVirtualSize()
}
}
+ setVirtualSize(face_area) ;
+
return face_area;
}
-F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
+BOOL LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
{
//get area of circle around face
LLVector3 center = getPositionAgent();
- LLVector3 size = (mExtents[1] - mExtents[0]) * 0.5f;
-
+ LLVector3 size = (mExtents[1] - mExtents[0]) * 0.5f;
LLViewerCamera* camera = LLViewerCamera::getInstance();
+
+ F32 size_squared = size.lengthSquared() ;
LLVector3 lookAt = center - camera->getOrigin();
- F32 dist = lookAt.normVec() ;
+ F32 dist = lookAt.normVec() ;
//get area of circle around node
- F32 app_angle = atanf(size.length()/dist);
+ F32 app_angle = atanf(fsqrtf(size_squared) / dist);
radius = app_angle*LLDrawable::sCurPixelAngle;
- F32 face_area = radius*radius * 3.14159f;
+ mPixelArea = radius*radius * 3.14159f;
+ cos_angle_to_view_dir = lookAt * camera->getXAxis() ;
+
+ //if has media, check if the face is out of the view frustum.
+ if(hasMedia())
+ {
+ if(!camera->AABBInFrustum(center, size))
+ {
+ mImportanceToCamera = 0.f ;
+ return false ;
+ }
+ if(cos_angle_to_view_dir > camera->getCosHalfFov()) //the center is within the view frustum
+ {
+ cos_angle_to_view_dir = 1.0f ;
+ }
+ else
+ {
+ if(dist * dist * (lookAt - camera->getXAxis()).lengthSquared() < size_squared)
+ {
+ cos_angle_to_view_dir = 1.0f ;
+ }
+ }
+ }
if(dist < mBoundingSphereRadius) //camera is very close
{
@@ -1394,12 +1471,11 @@ F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
mImportanceToCamera = 1.0f ;
}
else
- {
- cos_angle_to_view_dir = lookAt * camera->getXAxis() ;
+ {
mImportanceToCamera = LLFace::calcImportanceToCamera(cos_angle_to_view_dir, dist) ;
}
- return face_area ;
+ return true ;
}
//the projection of the face partially overlaps with the screen
@@ -1572,8 +1648,13 @@ S32 LLFace::pushVertices(const U16* index_array) const
{
if (mIndicesCount)
{
- mVertexBuffer->drawRange(LLRender::TRIANGLES, mGeomIndex, mGeomIndex+mGeomCount-1, mIndicesCount, mIndicesIndex);
- gPipeline.addTrianglesDrawn(mIndicesCount/3);
+ U32 render_type = LLRender::TRIANGLES;
+ if (mDrawInfo)
+ {
+ render_type = mDrawInfo->mDrawMode;
+ }
+ mVertexBuffer->drawRange(render_type, mGeomIndex, mGeomIndex+mGeomCount-1, mIndicesCount, mIndicesIndex);
+ gPipeline.addTrianglesDrawn(mIndicesCount, render_type);
}
return mIndicesCount;
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index e12b64a2f2..67dd97e6f7 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -194,6 +194,9 @@ public:
F32 getTextureVirtualSize() ;
F32 getImportanceToCamera()const {return mImportanceToCamera ;}
+ void setHasMedia(bool has_media) { mHasMedia = has_media ;}
+ BOOL hasMedia() const ;
+
//for atlas
LLTextureAtlasSlot* getAtlasInfo() ;
void setAtlasInUse(BOOL flag);
@@ -208,7 +211,7 @@ public:
private:
F32 adjustPartialOverlapPixelArea(F32 cos_angle_to_view_dir, F32 radius );
- F32 calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) ;
+ BOOL calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) ;
public:
static F32 calcImportanceToCamera(F32 to_view_dir, F32 dist);
@@ -262,7 +265,7 @@ private:
//based on the distance from the face to the view point and the angle from the face center to the view direction.
F32 mImportanceToCamera ;
F32 mBoundingSphereRadius ;
-
+ bool mHasMedia ;
//atlas
LLPointer<LLTextureAtlasSlot> mAtlasInfop ;
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index 90f6438980..bf7c735488 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -298,6 +298,20 @@ public:
return TRUE;
}
+ void setVisible(BOOL b)
+ {
+ // Overflow menu shouldn't hide when it still has focus. See EXT-4217.
+ if (!b && hasFocus())
+ return;
+ LLToggleableMenu::setVisible(b);
+ setFocus(b);
+ }
+
+ void onFocusLost()
+ {
+ setVisible(FALSE);
+ }
+
protected:
LLFavoriteLandmarkToggleableMenu(const LLToggleableMenu::Params& p):
LLToggleableMenu(p)
@@ -628,8 +642,8 @@ void LLFavoritesBarCtrl::draw()
if (mShowDragMarker)
{
- S32 w = mImageDragIndication->getWidth() / 2;
- S32 h = mImageDragIndication->getHeight() / 2;
+ S32 w = mImageDragIndication->getWidth();
+ S32 h = mImageDragIndication->getHeight();
if (mLandingTab)
{
@@ -777,6 +791,15 @@ void LLFavoritesBarCtrl::updateButtons()
mChevronButton->setRect(rect);
mChevronButton->setVisible(TRUE);
}
+ // Update overflow menu
+ LLToggleableMenu* overflow_menu = static_cast <LLToggleableMenu*> (mPopupMenuHandle.get());
+ if (overflow_menu && overflow_menu->getVisible())
+ {
+ overflow_menu->setFocus(FALSE);
+ overflow_menu->setVisible(FALSE);
+ if (mUpdateDropDownItems)
+ showDropDownMenu();
+ }
}
else
{
@@ -892,6 +915,8 @@ void LLFavoritesBarCtrl::showDropDownMenu()
if (menu)
{
+ // Release focus to allow changing of visibility.
+ menu->setFocus(FALSE);
if (!menu->toggleVisibility())
return;
@@ -1239,8 +1264,11 @@ LLInventoryModel::item_array_t::iterator LLFavoritesBarCtrl::findItemByUUID(LLIn
void LLFavoritesBarCtrl::insertBeforeItem(LLInventoryModel::item_array_t& items, const LLUUID& beforeItemId, LLViewerInventoryItem* insertedItem)
{
LLViewerInventoryItem* beforeItem = gInventory.getItem(beforeItemId);
-
- items.insert(findItemByUUID(items, beforeItem->getUUID()), insertedItem);
+ llassert(beforeItem);
+ if (beforeItem)
+ {
+ items.insert(findItemByUUID(items, beforeItem->getUUID()), insertedItem);
+ }
}
// EOF
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index fb724f30e0..fbb90c69f3 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -287,6 +287,7 @@ BOOL LLFeatureManager::loadFeatureTables()
if (!flp)
{
LL_ERRS("RenderInit") << "Specified parameter before <list> keyword!" << LL_ENDL;
+ return FALSE;
}
S32 available;
F32 recommended;
diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index 2873057c19..6a502e8d8c 100644
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -55,12 +55,14 @@ LLFilePicker LLFilePicker::sInstance;
#define SOUND_FILTER L"Sounds (*.wav)\0*.wav\0"
#define IMAGE_FILTER L"Images (*.tga; *.bmp; *.jpg; *.jpeg; *.png)\0*.tga;*.bmp;*.jpg;*.jpeg;*.png\0"
#define ANIM_FILTER L"Animations (*.bvh)\0*.bvh\0"
+#define COLLADA_FILTER L"Scene (*.dae)\0*.dae\0"
#ifdef _CORY_TESTING
#define GEOMETRY_FILTER L"SL Geometry (*.slg)\0*.slg\0"
#endif
#define XML_FILTER L"XML files (*.xml)\0*.xml\0"
#define SLOBJECT_FILTER L"Objects (*.slobject)\0*.slobject\0"
#define RAW_FILTER L"RAW files (*.raw)\0*.raw\0"
+#define MODEL_FILTER L"Model files (*.dae)\0*.dae\0"
#endif
//
@@ -176,6 +178,10 @@ BOOL LLFilePicker::setupFilter(ELoadFilter filter)
mOFN.lpstrFilter = ANIM_FILTER \
L"\0";
break;
+ case FFLOAD_COLLADA:
+ mOFN.lpstrFilter = COLLADA_FILTER \
+ L"\0";
+ break;
#ifdef _CORY_TESTING
case FFLOAD_GEOMETRY:
mOFN.lpstrFilter = GEOMETRY_FILTER \
@@ -194,6 +200,10 @@ BOOL LLFilePicker::setupFilter(ELoadFilter filter)
mOFN.lpstrFilter = RAW_FILTER \
L"\0";
break;
+ case FFLOAD_MODEL:
+ mOFN.lpstrFilter = MODEL_FILTER \
+ L"\0";
+ break;
default:
res = FALSE;
break;
@@ -543,6 +553,15 @@ Boolean LLFilePicker::navOpenFilterProc(AEDesc *theItem, void *info, void *callB
result = false;
}
}
+ else if (filter == FFLOAD_COLLADA)
+ {
+ if (fileInfo.filetype != 'DAE ' &&
+ (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("dae"), kCFCompareCaseInsensitive) != kCFCompareEqualTo))
+ )
+ {
+ result = false;
+ }
+ }
#ifdef _CORY_TESTING
else if (filter == FFLOAD_GEOMETRY)
{
@@ -1089,6 +1108,12 @@ static std::string add_bvh_filter_to_gtkchooser(GtkWindow *picker)
LLTrans::getString("animation_files") + " (*.bvh)");
}
+static std::string add_collada_filter_to_gtkchooser(GtkWindow *picker)
+{
+ return add_simple_pattern_filter_to_gtkchooser(picker, "*.dae",
+ LLTrans::getString("scene_files") + " (*.dae)");
+}
+
static std::string add_imageload_filter_to_gtkchooser(GtkWindow *picker)
{
GtkFileFilter *gfilter = gtk_file_filter_new();
@@ -1213,6 +1238,9 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
case FFLOAD_ANIM:
filtername = add_bvh_filter_to_gtkchooser(picker);
break;
+ case FFLOAD_COLLADA:
+ filtername = add_collada_filter_to_gtkchooser(picker);
+ break;
case FFLOAD_IMAGE:
filtername = add_imageload_filter_to_gtkchooser(picker);
break;
diff --git a/indra/newview/llfilepicker.h b/indra/newview/llfilepicker.h
index 4f254ff67e..98dc36c296 100644
--- a/indra/newview/llfilepicker.h
+++ b/indra/newview/llfilepicker.h
@@ -88,6 +88,8 @@ public:
FFLOAD_XML = 6,
FFLOAD_SLOBJECT = 7,
FFLOAD_RAW = 8,
+ FFLOAD_MODEL = 9,
+ FFLOAD_COLLADA = 10,
};
enum ESaveFilter
@@ -192,4 +194,6 @@ public:
~LLFilePicker();
};
+const std::string upload_pick(void* data);
+
#endif
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index 9496e94780..ecb6254f8a 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -65,7 +65,7 @@ public:
LLPanelCameraZoom();
/* virtual */ BOOL postBuild();
- /* virtual */ void onOpen(const LLSD& key);
+ /* virtual */ void draw();
protected:
void onZoomPlusHeldDown();
@@ -73,7 +73,6 @@ protected:
void onSliderValueChanged();
private:
- F32 mSavedSliderVal;
LLButton* mPlusBtn;
LLButton* mMinusBtn;
LLSlider* mSlider;
@@ -88,8 +87,7 @@ static LLRegisterPanelClassWrapper<LLPanelCameraZoom> t_camera_zoom_panel("camer
LLPanelCameraZoom::LLPanelCameraZoom()
: mPlusBtn( NULL ),
mMinusBtn( NULL ),
- mSlider( NULL ),
- mSavedSliderVal(0.f)
+ mSlider( NULL )
{
mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this));
mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this));
@@ -101,16 +99,13 @@ BOOL LLPanelCameraZoom::postBuild()
mPlusBtn = getChild <LLButton> ("zoom_plus_btn");
mMinusBtn = getChild <LLButton> ("zoom_minus_btn");
mSlider = getChild <LLSlider> ("zoom_slider");
- mSlider->setMinValue(.0f);
- mSlider->setMaxValue(8.f);
return LLPanel::postBuild();
}
-void LLPanelCameraZoom::onOpen(const LLSD& key)
+void LLPanelCameraZoom::draw()
{
- LLVector3d to_focus = gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin()) - gAgent.calcFocusPositionTargetGlobal();
- mSavedSliderVal = 8.f - (F32)to_focus.magVec(); // maximum minus current
- mSlider->setValue( mSavedSliderVal );
+ mSlider->setValue(gAgent.getCameraZoomFraction());
+ LLPanel::draw();
}
void LLPanelCameraZoom::onZoomPlusHeldDown()
@@ -135,13 +130,8 @@ void LLPanelCameraZoom::onZoomMinusHeldDown()
void LLPanelCameraZoom::onSliderValueChanged()
{
- F32 val = mSlider->getValueF32();
- F32 rate = val - mSavedSliderVal;
-
- gAgent.unlockView();
- gAgent.cameraOrbitIn(rate);
-
- mSavedSliderVal = val;
+ F32 zoom_level = mSlider->getValueF32();
+ gAgent.setCameraZoomFraction(zoom_level);
}
void activate_camera_tool()
diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp
index 73b79d8e13..b65457c4eb 100644
--- a/indra/newview/llfloatercolorpicker.cpp
+++ b/indra/newview/llfloatercolorpicker.cpp
@@ -586,7 +586,7 @@ void LLFloaterColorPicker::draw()
gl_triangle_2d ( startX, startY,
startX + mLumMarkerSize, startY - mLumMarkerSize,
startX + mLumMarkerSize, startY + mLumMarkerSize,
- LLColor4 ( 0.0f, 0.0f, 0.0f, 1.0f ), TRUE );
+ LLColor4 ( 0.75f, 0.75f, 0.75f, 1.0f ), TRUE );
// draw luminance slider outline
gl_rect_2d ( mLumRegionLeft,
diff --git a/indra/newview/llfloaterevent.cpp b/indra/newview/llfloaterevent.cpp
new file mode 100644
index 0000000000..64efa10ef9
--- /dev/null
+++ b/indra/newview/llfloaterevent.cpp
@@ -0,0 +1,324 @@
+/**
+ * @file llfloaterevent.cpp
+ * @brief Display for events in the finder
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterevent.h"
+
+#include "message.h"
+#include "llnotificationsutil.h"
+#include "llui.h"
+
+#include "llagent.h"
+#include "llviewerwindow.h"
+#include "llbutton.h"
+#include "llcachename.h"
+#include "llcommandhandler.h" // secondlife:///app/chat/ support
+#include "lleventflags.h"
+#include "lleventnotifier.h"
+#include "llexpandabletextbox.h"
+#include "llfloater.h"
+#include "llfloaterreg.h"
+#include "llfloaterworldmap.h"
+#include "llinventorymodel.h"
+#include "llsecondlifeurls.h"
+#include "llslurl.h"
+#include "lltextbox.h"
+#include "lltexteditor.h"
+#include "lluiconstants.h"
+#include "llviewercontrol.h"
+#include "llweb.h"
+#include "llworldmap.h"
+#include "lluictrlfactory.h"
+#include "lltrans.h"
+
+
+class LLEventHandler : public LLCommandHandler
+{
+public:
+ // requires trusted browser to trigger
+ LLEventHandler() : LLCommandHandler("event", UNTRUSTED_THROTTLE) { }
+ bool handle(const LLSD& params, const LLSD& query_map,
+ LLMediaCtrl* web)
+ {
+ if (params.size() < 1)
+ {
+ return false;
+ }
+
+ LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event");
+ if (floater)
+ {
+ floater->setEventID(params[0].asInteger());
+ LLFloaterReg::showTypedInstance<LLFloaterEvent>("event");
+ return true;
+ }
+
+ return false;
+ }
+};
+LLEventHandler gEventHandler;
+
+LLFloaterEvent::LLFloaterEvent(const LLSD& key)
+ : LLFloater(key),
+
+ mEventID(0)
+{
+}
+
+
+LLFloaterEvent::~LLFloaterEvent()
+{
+}
+
+
+BOOL LLFloaterEvent::postBuild()
+{
+ mTBName = getChild<LLTextBox>("event_name");
+
+ mTBCategory = getChild<LLTextBox>("event_category");
+
+ mTBDate = getChild<LLTextBox>("event_date");
+
+ mTBDuration = getChild<LLTextBox>("event_duration");
+
+ mTBDesc = getChild<LLExpandableTextBox>("event_desc");
+ mTBDesc->setEnabled(FALSE);
+
+ mTBRunBy = getChild<LLTextBox>("event_runby");
+ mTBLocation = getChild<LLTextBox>("event_location");
+ mTBCover = getChild<LLTextBox>("event_cover");
+
+ mTeleportBtn = getChild<LLButton>( "teleport_btn");
+ mTeleportBtn->setClickedCallback(onClickTeleport, this);
+
+ mMapBtn = getChild<LLButton>( "map_btn");
+ mMapBtn->setClickedCallback(onClickMap, this);
+
+ mNotifyBtn = getChild<LLButton>( "notify_btn");
+ mNotifyBtn->setClickedCallback(onClickNotify, this);
+
+ mCreateEventBtn = getChild<LLButton>( "create_event_btn");
+ mCreateEventBtn->setClickedCallback(onClickCreateEvent, this);
+
+ mGodDeleteEventBtn = getChild<LLButton>( "god_delete_event_btn");
+ mGodDeleteEventBtn->setClickedCallback(boost::bind(&LLFloaterEvent::onClickDeleteEvent, this));
+
+ return TRUE;
+}
+
+void LLFloaterEvent::setEventID(const U32 event_id)
+{
+ mEventID = event_id;
+ // Should reset all of the panel state here
+ resetInfo();
+
+ if (event_id != 0)
+ {
+ sendEventInfoRequest();
+ }
+}
+
+void LLFloaterEvent::onClickDeleteEvent()
+{
+ LLMessageSystem* msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_EventGodDelete);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+
+ msg->nextBlockFast(_PREHASH_EventData);
+ msg->addU32Fast(_PREHASH_EventID, mEventID);
+
+ gAgent.sendReliableMessage();
+}
+
+void LLFloaterEvent::sendEventInfoRequest()
+{
+ LLMessageSystem *msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_EventInfoRequest);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
+ msg->nextBlockFast(_PREHASH_EventData);
+ msg->addU32Fast(_PREHASH_EventID, mEventID);
+ gAgent.sendReliableMessage();
+}
+
+//static
+void LLFloaterEvent::processEventInfoReply(LLMessageSystem *msg, void **)
+{
+ // extract the agent id
+ LLUUID agent_id;
+ msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
+
+ LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event");
+
+ if(floater)
+ {
+ floater->mEventInfo.unpack(msg);
+ floater->mTBName->setText(floater->mEventInfo.mName);
+ floater->mTBCategory->setText(floater->mEventInfo.mCategoryStr);
+ floater->mTBDate->setText(floater->mEventInfo.mTimeStr);
+ floater->mTBDesc->setText(floater->mEventInfo.mDesc);
+ floater->mTBRunBy->setText(LLSLURL::buildCommand("agent", floater->mEventInfo.mRunByID, "inspect"));
+
+ floater->mTBDuration->setText(llformat("%d:%.2d", floater->mEventInfo.mDuration / 60, floater->mEventInfo.mDuration % 60));
+
+ if (!floater->mEventInfo.mHasCover)
+ {
+ floater->mTBCover->setText(floater->getString("none"));
+ }
+ else
+ {
+ floater->mTBCover->setText(llformat("%d", floater->mEventInfo.mCover));
+ }
+
+ F32 global_x = (F32)floater->mEventInfo.mPosGlobal.mdV[VX];
+ F32 global_y = (F32)floater->mEventInfo.mPosGlobal.mdV[VY];
+
+ S32 region_x = llround(global_x) % REGION_WIDTH_UNITS;
+ S32 region_y = llround(global_y) % REGION_WIDTH_UNITS;
+ S32 region_z = llround((F32)floater->mEventInfo.mPosGlobal.mdV[VZ]);
+
+ std::string desc = floater->mEventInfo.mSimName + llformat(" (%d, %d, %d)", region_x, region_y, region_z);
+ floater->mTBLocation->setText(desc);
+
+ if (floater->mEventInfo.mEventFlags & EVENT_FLAG_MATURE)
+ {
+ floater->childSetVisible("event_mature_yes", TRUE);
+ floater->childSetVisible("event_mature_no", FALSE);
+ }
+ else
+ {
+ floater->childSetVisible("event_mature_yes", FALSE);
+ floater->childSetVisible("event_mature_no", TRUE);
+ }
+
+ if (floater->mEventInfo.mUnixTime < time_corrected())
+ {
+ floater->mNotifyBtn->setEnabled(FALSE);
+ }
+ else
+ {
+ floater->mNotifyBtn->setEnabled(TRUE);
+ }
+
+ if (gEventNotifier.hasNotification(floater->mEventInfo.mID))
+ {
+ floater->mNotifyBtn->setLabel(floater->getString("dont_notify"));
+ }
+ else
+ {
+ floater->mNotifyBtn->setLabel(floater->getString("notify"));
+ }
+
+ floater->mMapBtn->setEnabled(TRUE);
+ floater->mTeleportBtn->setEnabled(TRUE);
+ }
+}
+
+
+void LLFloaterEvent::draw()
+{
+ mGodDeleteEventBtn->setVisible(gAgent.isGodlike());
+
+ LLPanel::draw();
+}
+
+void LLFloaterEvent::resetInfo()
+{
+ mTBName->setText(LLStringUtil::null);
+ mTBCategory->setText(LLStringUtil::null);
+ mTBDate->setText(LLStringUtil::null);
+ mTBDesc->setText(LLStringUtil::null);
+ mTBDuration->setText(LLStringUtil::null);
+ mTBCover->setText(LLStringUtil::null);
+ mTBLocation->setText(LLStringUtil::null);
+ mTBRunBy->setText(LLStringUtil::null);
+ mNotifyBtn->setEnabled(FALSE);
+ mMapBtn->setEnabled(FALSE);
+ mTeleportBtn->setEnabled(FALSE);
+}
+
+// static
+void LLFloaterEvent::onClickTeleport(void* data)
+{
+ LLFloaterEvent* self = (LLFloaterEvent*)data;
+ LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
+ if (!self->mEventInfo.mPosGlobal.isExactlyZero()&&worldmap_instance)
+ {
+ gAgent.teleportViaLocation(self->mEventInfo.mPosGlobal);
+ worldmap_instance->trackLocation(self->mEventInfo.mPosGlobal);
+ }
+}
+
+
+// static
+void LLFloaterEvent::onClickMap(void* data)
+{
+ LLFloaterEvent* self = (LLFloaterEvent*)data;
+ LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
+
+ if (!self->mEventInfo.mPosGlobal.isExactlyZero()&&worldmap_instance)
+ {
+ worldmap_instance->trackLocation(self->mEventInfo.mPosGlobal);
+ LLFloaterReg::showInstance("world_map", "center");
+ }
+}
+
+
+// static
+void LLFloaterEvent::onClickCreateEvent(void* data)
+{
+ LLNotificationsUtil::add("PromptGoToEventsPage");//, LLSD(), LLSD(), callbackCreateEventWebPage);
+}
+
+
+// static
+void LLFloaterEvent::onClickNotify(void *data)
+{
+ LLFloaterEvent* self = (LLFloaterEvent*)data;
+
+ if (!gEventNotifier.hasNotification(self->mEventID))
+ {
+ gEventNotifier.add(self->mEventInfo);
+ self->mNotifyBtn->setLabel(self->getString("dont_notify"));
+ }
+ else
+ {
+ gEventNotifier.remove(self->mEventInfo.mID);
+ self->mNotifyBtn->setLabel(self->getString("notify"));
+ }
+}
diff --git a/indra/newview/llfloaterevent.h b/indra/newview/llfloaterevent.h
new file mode 100644
index 0000000000..54aaaf6a0f
--- /dev/null
+++ b/indra/newview/llfloaterevent.h
@@ -0,0 +1,96 @@
+/**
+ * @file llfloaterevent.h
+ * @brief Display for events in the finder
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATEREVENT_H
+#define LL_LLFLOATEREVENT_H
+
+#include "llfloater.h"
+#include "lleventinfo.h"
+#include "lluuid.h"
+#include "v3dmath.h"
+
+class LLTextBox;
+class LLTextEditor;
+class LLButton;
+class LLExpandableTextBox;
+class LLMessageSystem;
+
+class LLFloaterEvent : public LLFloater
+{
+public:
+ LLFloaterEvent(const LLSD& key);
+ /*virtual*/ ~LLFloaterEvent();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void draw();
+
+ void setEventID(const U32 event_id);
+ void sendEventInfoRequest();
+
+ static void processEventInfoReply(LLMessageSystem *msg, void **);
+
+ U32 getEventID() { return mEventID; }
+
+protected:
+ void resetInfo();
+
+ static void onClickTeleport(void*);
+ static void onClickMap(void*);
+ //static void onClickLandmark(void*);
+ static void onClickCreateEvent(void*);
+ static void onClickNotify(void*);
+ void onClickDeleteEvent();
+
+// static bool callbackCreateEventWebPage(const LLSD& notification, const LLSD& response);
+
+protected:
+ U32 mEventID;
+ LLEventInfo mEventInfo;
+
+ LLTextBox* mTBName;
+ LLTextBox* mTBCategory;
+ LLTextBox* mTBDate;
+ LLTextBox* mTBDuration;
+ LLExpandableTextBox* mTBDesc;
+
+ LLTextBox* mTBRunBy;
+ LLTextBox* mTBLocation;
+ LLTextBox* mTBCover;
+
+ LLButton* mTeleportBtn;
+ LLButton* mMapBtn;
+ LLButton* mCreateEventBtn;
+ LLButton* mGodDeleteEventBtn;
+ LLButton* mNotifyBtn;
+};
+
+#endif // LL_LLFLOATEREVENT_H
diff --git a/indra/newview/llfloaterfriends.cpp b/indra/newview/llfloaterfriends.cpp
index ccc5cab85a..4e2633d750 100644
--- a/indra/newview/llfloaterfriends.cpp
+++ b/indra/newview/llfloaterfriends.cpp
@@ -58,7 +58,7 @@
#include "llmenucommands.h"
#include "llviewercontrol.h"
#include "llviewermessage.h"
-#include "lltimer.h"
+#include "lleventtimer.h"
#include "lltextbox.h"
#include "llvoiceclient.h"
diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index b684e1f985..9c1ac2631d 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -203,12 +203,12 @@ BOOL LLFloaterGesture::postBuild()
gInventory.addObserver(this);
fetchDescendents(folders);
- buildGestureList();
-
- mGestureList->setFocus(TRUE);
-
if (mGestureList)
{
+ buildGestureList();
+
+ mGestureList->setFocus(TRUE);
+
const BOOL ascending = TRUE;
mGestureList->sortByColumn(std::string("name"), ascending);
mGestureList->selectFirstItem();
@@ -223,10 +223,10 @@ BOOL LLFloaterGesture::postBuild()
void LLFloaterGesture::refreshAll()
{
- buildGestureList();
-
if (!mGestureList) return;
+ buildGestureList();
+
if (mSelectedID.isNull())
{
mGestureList->selectFirstItem();
@@ -427,8 +427,13 @@ void LLFloaterGesture::onClickPlay()
BOOL inform_server = TRUE;
BOOL deactivate_similar = FALSE;
LLGestureManager::instance().setGestureLoadedCallback(item_id, boost::bind(&LLFloaterGesture::playGesture, this, item_id));
- LLGestureManager::instance().activateGestureWithAsset(item_id, gInventory.getItem(item_id)->getAssetUUID(), inform_server, deactivate_similar);
- LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL;
+ LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ llassert(item);
+ if (item)
+ {
+ LLGestureManager::instance().activateGestureWithAsset(item_id, item->getAssetUUID(), inform_server, deactivate_similar);
+ LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL;
+ }
}
else
{
@@ -510,15 +515,16 @@ void LLFloaterGesture::onCopyPasteAction(const LLSD& command)
if(ids.empty() || !gInventory.isCategoryComplete(mGestureFolderID))
return;
LLInventoryCategory* gesture_dir = gInventory.getCategory(mGestureFolderID);
+ llassert(gesture_dir);
LLPointer<GestureCopiedCallback> cb = new GestureCopiedCallback(this);
for(LLDynamicArray<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++)
{
LLInventoryItem* item = gInventory.getItem(*it);
- LLStringUtil::format_map_t string_args;
- string_args["[COPY_NAME]"] = item->getName();
- if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
+ if(gesture_dir && item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
{
+ LLStringUtil::format_map_t string_args;
+ string_args["[COPY_NAME]"] = item->getName();
LL_DEBUGS("Gesture")<< "Copying gesture " << item->getName() << " "<< item->getUUID() << " into "
<< gesture_dir->getName() << " "<< gesture_dir->getUUID() << LL_ENDL;
copy_inventory_item(gAgent.getID(), item->getPermissions().getOwner(), item->getUUID(),
diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp
index c2b0bd18fa..5294f09e64 100644
--- a/indra/newview/llfloatergodtools.cpp
+++ b/indra/newview/llfloatergodtools.cpp
@@ -414,17 +414,17 @@ LLPanelRegionTools::LLPanelRegionTools()
BOOL LLPanelRegionTools::postBuild()
{
getChild<LLLineEditor>("region name")->setKeystrokeCallback(onChangeSimName, this);
- childSetPrevalidate("region name", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
- childSetPrevalidate("estate", &LLLineEditor::prevalidatePositiveS32);
- childSetPrevalidate("parentestate", &LLLineEditor::prevalidatePositiveS32);
+ childSetPrevalidate("region name", &LLTextValidate::validateASCIIPrintableNoPipe);
+ childSetPrevalidate("estate", &LLTextValidate::validatePositiveS32);
+ childSetPrevalidate("parentestate", &LLTextValidate::validatePositiveS32);
childDisable("parentestate");
- childSetPrevalidate("gridposx", &LLLineEditor::prevalidatePositiveS32);
+ childSetPrevalidate("gridposx", &LLTextValidate::validatePositiveS32);
childDisable("gridposx");
- childSetPrevalidate("gridposy", &LLLineEditor::prevalidatePositiveS32);
+ childSetPrevalidate("gridposy", &LLTextValidate::validatePositiveS32);
childDisable("gridposy");
- childSetPrevalidate("redirectx", &LLLineEditor::prevalidatePositiveS32);
- childSetPrevalidate("redirecty", &LLLineEditor::prevalidatePositiveS32);
+ childSetPrevalidate("redirectx", &LLTextValidate::validatePositiveS32);
+ childSetPrevalidate("redirecty", &LLTextValidate::validatePositiveS32);
return TRUE;
}
diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp
index 61568df12e..9917593c91 100644
--- a/indra/newview/llfloaterimagepreview.cpp
+++ b/indra/newview/llfloaterimagepreview.cpp
@@ -688,6 +688,9 @@ BOOL LLImagePreviewAvatar::render()
mNeedsUpdate = FALSE;
LLVOAvatar* avatarp = mDummyAvatar;
+ gGL.pushUIMatrix();
+ gGL.loadUIIdentity();
+
glMatrixMode(GL_PROJECTION);
gGL.pushMatrix();
glLoadIdentity();
@@ -696,6 +699,7 @@ BOOL LLImagePreviewAvatar::render()
glMatrixMode(GL_MODELVIEW);
gGL.pushMatrix();
glLoadIdentity();
+
LLGLSUIDefault def;
gGL.color4f(0.15f, 0.2f, 0.3f, 1.f);
@@ -741,6 +745,7 @@ BOOL LLImagePreviewAvatar::render()
avatarPoolp->renderAvatars(avatarp); // renders only one avatar
}
+ gGL.popUIMatrix();
gGL.color4f(1,1,1,1);
return TRUE;
}
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 8cd63deebe..26c6db9652 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -353,7 +353,7 @@ BOOL LLPanelLandGeneral::postBuild()
{
mEditName = getChild<LLLineEditor>("Name");
mEditName->setCommitCallback(onCommitAny, this);
- childSetPrevalidate("Name", LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("Name", LLTextValidate::validateASCIIPrintableNoPipe);
mEditDesc = getChild<LLTextEditor>("Description");
mEditDesc->setCommitOnFocusLost(TRUE);
@@ -1111,7 +1111,7 @@ BOOL LLPanelLandObjects::postBuild()
mCleanOtherObjectsTime->setFocusLostCallback(boost::bind(onLostFocus, _1, this));
mCleanOtherObjectsTime->setCommitCallback(onCommitClean, this);
- childSetPrevalidate("clean other time", LLLineEditor::prevalidateNonNegativeS32);
+ childSetPrevalidate("clean other time", LLTextValidate::validateNonNegativeS32);
mBtnRefresh = getChild<LLButton>("Refresh List");
mBtnRefresh->setClickedCallback(onClickRefresh, this);
diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp
index 7388f7ea3f..62ec17f89a 100644
--- a/indra/newview/llfloatermediasettings.cpp
+++ b/indra/newview/llfloatermediasettings.cpp
@@ -207,7 +207,7 @@ void LLFloaterMediaSettings::commitFields()
if (hasFocus())
{
LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
- if (cur_focus->acceptsTextInput())
+ if (cur_focus && cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
};
diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp
index 810761e034..159ce41b79 100644
--- a/indra/newview/llfloaternamedesc.cpp
+++ b/indra/newview/llfloaternamedesc.cpp
@@ -111,7 +111,7 @@ BOOL LLFloaterNameDesc::postBuild()
if (NameEditor)
{
NameEditor->setMaxTextLength(DB_INV_ITEM_NAME_STR_LEN);
- NameEditor->setPrevalidate(&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ NameEditor->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
}
y -= llfloor(PREVIEW_LINE_HEIGHT * 1.2f);
@@ -123,7 +123,7 @@ BOOL LLFloaterNameDesc::postBuild()
if (DescEditor)
{
DescEditor->setMaxTextLength(DB_INV_ITEM_DESC_STR_LEN);
- DescEditor->setPrevalidate(&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ DescEditor->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
}
y -= llfloor(PREVIEW_LINE_HEIGHT * 1.2f);
diff --git a/indra/newview/llfloaternotificationsconsole.cpp b/indra/newview/llfloaternotificationsconsole.cpp
index 90db8988b2..94b5ebba00 100644
--- a/indra/newview/llfloaternotificationsconsole.cpp
+++ b/indra/newview/llfloaternotificationsconsole.cpp
@@ -112,10 +112,15 @@ void LLNotificationChannelPanel::onClickNotification(void* user_data)
{
LLNotificationChannelPanel* self = (LLNotificationChannelPanel*)user_data;
if (!self) return;
- void* data = self->getChild<LLScrollListCtrl>("notifications_list")->getFirstSelected()->getUserdata();
- if (data)
+ LLScrollListItem* firstselected = self->getChild<LLScrollListCtrl>("notifications_list")->getFirstSelected();
+ llassert(firstselected);
+ if (firstselected)
{
- gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE);
+ void* data = firstselected->getUserdata();
+ if (data)
+ {
+ gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE);
+ }
}
}
@@ -124,10 +129,15 @@ void LLNotificationChannelPanel::onClickNotificationReject(void* user_data)
{
LLNotificationChannelPanel* self = (LLNotificationChannelPanel*)user_data;
if (!self) return;
- void* data = self->getChild<LLScrollListCtrl>("notification_rejects_list")->getFirstSelected()->getUserdata();
- if (data)
+ LLScrollListItem* firstselected = self->getChild<LLScrollListCtrl>("notification_rejects_list")->getFirstSelected();
+ llassert(firstselected);
+ if (firstselected)
{
- gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE);
+ void* data = firstselected->getUserdata();
+ if (data)
+ {
+ gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE);
+ }
}
}
diff --git a/indra/newview/llfloaterpay.cpp b/indra/newview/llfloaterpay.cpp
index 00959322e5..51364594e4 100644
--- a/indra/newview/llfloaterpay.cpp
+++ b/indra/newview/llfloaterpay.cpp
@@ -204,7 +204,7 @@ BOOL LLFloaterPay::postBuild()
getChild<LLLineEditor>("amount")->setKeystrokeCallback(&LLFloaterPay::onKeystroke, this);
childSetText("amount", last_amount);
- childSetPrevalidate("amount", LLLineEditor::prevalidateNonNegativeS32);
+ childSetPrevalidate("amount", LLTextValidate::validateNonNegativeS32);
info = new LLGiveMoneyInfo(this, 0);
mCallbackData.push_back(info);
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 9d9fbacee3..43111d76f7 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -110,8 +110,6 @@
const F32 MAX_USER_FAR_CLIP = 512.f;
const F32 MIN_USER_FAR_CLIP = 64.f;
-const S32 ASPECT_RATIO_STR_LEN = 100;
-
class LLVoiceSetKeyDialog : public LLModalDialog
{
public:
@@ -283,7 +281,6 @@ void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator)
}
// static
std::string LLFloaterPreference::sSkin = "";
-F32 LLFloaterPreference::sAspectRatio = 0.0;
//////////////////////////////////////////////
// LLFloaterPreference
@@ -324,11 +321,9 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.VertexShaderEnable", boost::bind(&LLFloaterPreference::onVertexShaderEnable, this));
mCommitCallbackRegistrar.add("Pref.WindowedMod", boost::bind(&LLFloaterPreference::onCommitWindowedMode, this));
mCommitCallbackRegistrar.add("Pref.UpdateSliderText", boost::bind(&LLFloaterPreference::onUpdateSliderText,this, _1,_2));
- mCommitCallbackRegistrar.add("Pref.AutoDetectAspect", boost::bind(&LLFloaterPreference::onCommitAutoDetectAspect, this));
mCommitCallbackRegistrar.add("Pref.ParcelMediaAutoPlayEnable", boost::bind(&LLFloaterPreference::onCommitParcelMediaAutoPlayEnable, this));
mCommitCallbackRegistrar.add("Pref.MediaEnabled", boost::bind(&LLFloaterPreference::onCommitMediaEnabled, this));
mCommitCallbackRegistrar.add("Pref.MusicEnabled", boost::bind(&LLFloaterPreference::onCommitMusicEnabled, this));
- mCommitCallbackRegistrar.add("Pref.onSelectAspectRatio", boost::bind(&LLFloaterPreference::onKeystrokeAspectRatio, this));
mCommitCallbackRegistrar.add("Pref.QualityPerformance", boost::bind(&LLFloaterPreference::onChangeQuality, this, _2));
mCommitCallbackRegistrar.add("Pref.applyUIColor", boost::bind(&LLFloaterPreference::applyUIColor, this ,_1, _2));
mCommitCallbackRegistrar.add("Pref.getUIColor", boost::bind(&LLFloaterPreference::getUIColor, this ,_1, _2));
@@ -359,12 +354,7 @@ BOOL LLFloaterPreference::postBuild()
LLFloaterPreference::~LLFloaterPreference()
{
// clean up user data
- LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio");
LLComboBox* ctrl_window_size = getChild<LLComboBox>("windowsize combo");
- for (S32 i = 0; i < ctrl_aspect_ratio->getItemCount(); i++)
- {
- ctrl_aspect_ratio->setCurrentByIndex(i);
- }
for (S32 i = 0; i < ctrl_window_size->getItemCount(); i++)
{
ctrl_window_size->setCurrentByIndex(i);
@@ -514,8 +504,6 @@ void LLFloaterPreference::cancel()
LLFloaterReg::hideInstance("pref_voicedevicesettings");
- gSavedSettings.setF32("FullScreenAspectRatio", sAspectRatio);
-
}
void LLFloaterPreference::onOpen(const LLSD& key)
@@ -602,7 +590,7 @@ void LLFloaterPreference::onBtnOK()
if (hasFocus())
{
LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
- if (cur_focus->acceptsTextInput())
+ if (cur_focus && cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
}
@@ -635,7 +623,7 @@ void LLFloaterPreference::onBtnApply( )
if (hasFocus())
{
LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
- if (cur_focus->acceptsTextInput())
+ if (cur_focus && cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
}
@@ -652,7 +640,7 @@ void LLFloaterPreference::onBtnCancel()
if (hasFocus())
{
LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
- if (cur_focus->acceptsTextInput())
+ if (cur_focus && cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
}
@@ -968,37 +956,6 @@ void LLFloaterPreference::disableUnavailableSettings()
}
}
-void LLFloaterPreference::onCommitAutoDetectAspect()
-{
- BOOL auto_detect = getChild<LLCheckBoxCtrl>("aspect_auto_detect")->get();
- F32 ratio;
-
- if (auto_detect)
- {
- S32 numerator = 0;
- S32 denominator = 0;
-
- // clear any aspect ratio override
- gViewerWindow->mWindow->setNativeAspectRatio(0.f);
- fractionFromDecimal(gViewerWindow->mWindow->getNativeAspectRatio(), numerator, denominator);
-
- std::string aspect;
- if (numerator != 0)
- {
- aspect = llformat("%d:%d", numerator, denominator);
- }
- else
- {
- aspect = llformat("%.3f", gViewerWindow->mWindow->getNativeAspectRatio());
- }
-
- getChild<LLComboBox>( "aspect_ratio")->setLabel(aspect);
-
- ratio = gViewerWindow->mWindow->getNativeAspectRatio();
- gSavedSettings.setF32("FullScreenAspectRatio", ratio);
- }
-}
-
void LLFloaterPreference::onCommitParcelMediaAutoPlayEnable()
{
BOOL autoplay = getChild<LLCheckBoxCtrl>("autoplay_enabled")->get();
@@ -1266,56 +1223,9 @@ void LLFloaterPreference::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_b
}
}
-void LLFloaterPreference::onKeystrokeAspectRatio()
-{
- getChild<LLCheckBoxCtrl>("aspect_auto_detect")->set(FALSE);
-}
-
void LLFloaterPreference::applyResolution()
{
- LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio");
gGL.flush();
- char aspect_ratio_text[ASPECT_RATIO_STR_LEN]; /*Flawfinder: ignore*/
- if (ctrl_aspect_ratio->getCurrentIndex() == -1)
- {
- // *Can't pass const char* from c_str() into strtok
- strncpy(aspect_ratio_text, ctrl_aspect_ratio->getSimple().c_str(), sizeof(aspect_ratio_text) -1); /*Flawfinder: ignore*/
- aspect_ratio_text[sizeof(aspect_ratio_text) -1] = '\0';
- char *element = strtok(aspect_ratio_text, ":/\\");
- if (!element)
- {
- sAspectRatio = 0.f; // will be clamped later
- }
- else
- {
- LLLocale locale(LLLocale::USER_LOCALE);
- sAspectRatio = (F32)atof(element);
- }
-
- // look for denominator
- element = strtok(NULL, ":/\\");
- if (element)
- {
- LLLocale locale(LLLocale::USER_LOCALE);
-
- F32 denominator = (F32)atof(element);
- if (denominator != 0.f)
- {
- sAspectRatio /= denominator;
- }
- }
- }
- else
- {
- sAspectRatio = (F32)ctrl_aspect_ratio->getValue().asReal();
- }
-
- // presumably, user entered a non-numeric value if aspect_ratio == 0.f
- if (sAspectRatio != 0.f)
- {
- sAspectRatio = llclamp(sAspectRatio, 0.2f, 5.f);
- gSavedSettings.setF32("FullScreenAspectRatio", sAspectRatio);
- }
// Screen resolution
S32 num_resolutions;
@@ -1393,48 +1303,6 @@ BOOL LLPanelPreference::postBuild()
childSetText("email_address",getString("log_in_to_change") );
// childSetText("busy_response", getString("log_in_to_change"));
}
-
-
- if(hasChild("aspect_ratio"))
- {
- // We used to set up fullscreen resolution and window size
- // controls here, see LLFloaterWindowSize::initWindowSizeControls()
-
- if (gSavedSettings.getBOOL("FullScreenAutoDetectAspectRatio"))
- {
- LLFloaterPreference::sAspectRatio = gViewerWindow->getDisplayAspectRatio();
- }
- else
- {
- LLFloaterPreference::sAspectRatio = gSavedSettings.getF32("FullScreenAspectRatio");
- }
-
- getChild<LLComboBox>("aspect_ratio")->setTextEntryCallback(boost::bind(&LLPanelPreference::setControlFalse, this, LLSD("FullScreenAutoDetectAspectRatio") ));
-
-
- S32 numerator = 0;
- S32 denominator = 0;
- fractionFromDecimal(LLFloaterPreference::sAspectRatio, numerator, denominator);
-
- LLUIString aspect_ratio_text = getString("aspect_ratio_text");
- if (numerator != 0)
- {
- aspect_ratio_text.setArg("[NUM]", llformat("%d", numerator));
- aspect_ratio_text.setArg("[DEN]", llformat("%d", denominator));
- }
- else
- {
- aspect_ratio_text = llformat("%.3f", LLFloaterPreference::sAspectRatio);
- }
-
- LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio");
- //mCtrlAspectRatio->setCommitCallback(onSelectAspectRatio, this);
- // add default aspect ratios
- ctrl_aspect_ratio->add(aspect_ratio_text, &LLFloaterPreference::sAspectRatio, ADD_TOP);
- ctrl_aspect_ratio->setCurrentByIndex(0);
-
- refresh();
- }
//////////////////////PanelPrivacy ///////////////////
if (hasChild("media_enabled"))
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 0827c7c2b2..93b39d72bc 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -128,10 +128,8 @@ public:
void updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box);
void onUpdateSliderText(LLUICtrl* ctrl, const LLSD& name);
- void onKeystrokeAspectRatio();
// void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator);
- void onCommitAutoDetectAspect();
void onCommitParcelMediaAutoPlayEnable();
void onCommitMediaEnabled();
void onCommitMusicEnabled();
@@ -142,7 +140,6 @@ public:
void buildPopupLists();
static void refreshSkin(void* data);
static void cleanupBadSetting();
- static F32 sAspectRatio;
private:
static std::string sSkin;
bool mGotPersonalInfo;
diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp
index ff9002787c..5c0593ad29 100644
--- a/indra/newview/llfloaterproperties.cpp
+++ b/indra/newview/llfloaterproperties.cpp
@@ -130,9 +130,9 @@ BOOL LLFloaterProperties::postBuild()
{
// build the UI
// item name & description
- childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("LabelItemName",&LLTextValidate::validateASCIIPrintableNoPipe);
getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitName,this));
- childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("LabelItemDesc",&LLTextValidate::validateASCIIPrintableNoPipe);
getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLFloaterProperties:: onCommitDescription, this));
// Creator information
getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLFloaterProperties::onClickCreator,this));
@@ -880,7 +880,11 @@ void LLFloaterProperties::dirtyAll()
iter != inst_list.end(); ++iter)
{
LLFloaterProperties* floater = dynamic_cast<LLFloaterProperties*>(*iter);
- floater->dirty();
+ llassert(floater); // else cast failed - wrong type D:
+ if (floater)
+ {
+ floater->dirty();
+ }
}
}
diff --git a/indra/newview/llfloaterscriptlimits.cpp b/indra/newview/llfloaterscriptlimits.cpp
index 4194416a01..fdf128945e 100644
--- a/indra/newview/llfloaterscriptlimits.cpp
+++ b/indra/newview/llfloaterscriptlimits.cpp
@@ -744,13 +744,13 @@ void LLPanelScriptLimitsRegionMemory::setRegionSummary(LLSD content)
{
mParcelMemoryUsed = content["summary"]["used"][0]["amount"].asInteger() / SIZE_OF_ONE_KB;
mParcelMemoryMax = content["summary"]["available"][0]["amount"].asInteger() / SIZE_OF_ONE_KB;
- mGotParcelMemoryUsed = TRUE;
+ mGotParcelMemoryUsed = true;
}
else if(content["summary"]["used"][1]["type"].asString() == std::string("memory"))
{
mParcelMemoryUsed = content["summary"]["used"][1]["amount"].asInteger() / SIZE_OF_ONE_KB;
mParcelMemoryMax = content["summary"]["available"][1]["amount"].asInteger() / SIZE_OF_ONE_KB;
- mGotParcelMemoryUsed = TRUE;
+ mGotParcelMemoryUsed = true;
}
else
{
@@ -762,13 +762,13 @@ void LLPanelScriptLimitsRegionMemory::setRegionSummary(LLSD content)
{
mParcelURLsUsed = content["summary"]["used"][0]["amount"].asInteger();
mParcelURLsMax = content["summary"]["available"][0]["amount"].asInteger();
- mGotParcelURLsUsed = TRUE;
+ mGotParcelURLsUsed = true;
}
else if(content["summary"]["used"][1]["type"].asString() == std::string("urls"))
{
mParcelURLsUsed = content["summary"]["used"][1]["amount"].asInteger();
mParcelURLsMax = content["summary"]["available"][1]["amount"].asInteger();
- mGotParcelURLsUsed = TRUE;
+ mGotParcelURLsUsed = true;
}
else
{
@@ -902,10 +902,10 @@ void LLPanelScriptLimitsRegionMemory::clearList()
list->operateOnAll(LLCtrlListInterface::OP_DELETE);
}
- mGotParcelMemoryUsed = FALSE;
- mGotParcelMemoryMax = FALSE;
- mGotParcelURLsUsed = FALSE;
- mGotParcelURLsMax = FALSE;
+ mGotParcelMemoryUsed = false;
+ mGotParcelMemoryMax = false;
+ mGotParcelURLsUsed = false;
+ mGotParcelURLsMax = false;
LLStringUtil::format_map_t args_parcel_memory;
std::string msg_empty_string("");
@@ -1208,13 +1208,13 @@ void LLPanelScriptLimitsAttachment::setAttachmentSummary(LLSD content)
{
mAttachmentMemoryUsed = content["summary"]["used"][0]["amount"].asInteger() / SIZE_OF_ONE_KB;
mAttachmentMemoryMax = content["summary"]["available"][0]["amount"].asInteger() / SIZE_OF_ONE_KB;
- mGotAttachmentMemoryUsed = TRUE;
+ mGotAttachmentMemoryUsed = true;
}
else if(content["summary"]["used"][1]["type"].asString() == std::string("memory"))
{
mAttachmentMemoryUsed = content["summary"]["used"][1]["amount"].asInteger() / SIZE_OF_ONE_KB;
mAttachmentMemoryMax = content["summary"]["available"][1]["amount"].asInteger() / SIZE_OF_ONE_KB;
- mGotAttachmentMemoryUsed = TRUE;
+ mGotAttachmentMemoryUsed = true;
}
else
{
@@ -1226,13 +1226,13 @@ void LLPanelScriptLimitsAttachment::setAttachmentSummary(LLSD content)
{
mAttachmentURLsUsed = content["summary"]["used"][0]["amount"].asInteger();
mAttachmentURLsMax = content["summary"]["available"][0]["amount"].asInteger();
- mGotAttachmentURLsUsed = TRUE;
+ mGotAttachmentURLsUsed = true;
}
else if(content["summary"]["used"][1]["type"].asString() == std::string("urls"))
{
mAttachmentURLsUsed = content["summary"]["used"][1]["amount"].asInteger();
mAttachmentURLsMax = content["summary"]["available"][1]["amount"].asInteger();
- mGotAttachmentURLsUsed = TRUE;
+ mGotAttachmentURLsUsed = true;
}
else
{
diff --git a/indra/newview/llfloaterscriptlimits.h b/indra/newview/llfloaterscriptlimits.h
index 4c1ecc1019..0cba4d72f2 100644
--- a/indra/newview/llfloaterscriptlimits.h
+++ b/indra/newview/llfloaterscriptlimits.h
@@ -148,8 +148,8 @@ public:
: LLPanelScriptLimitsInfo(), LLRemoteParcelInfoObserver(),
mParcelId(LLUUID()),
- mGotParcelMemoryUsed(FALSE),
- mGotParcelMemoryMax(FALSE),
+ mGotParcelMemoryUsed(false),
+ mGotParcelMemoryMax(false),
mParcelMemoryMax(0),
mParcelMemoryUsed(0) {};
@@ -180,16 +180,16 @@ private:
LLSD mContent;
LLUUID mParcelId;
- BOOL mGotParcelMemoryUsed;
- BOOL mGotParcelMemoryUsedDetails;
- BOOL mGotParcelMemoryMax;
+ bool mGotParcelMemoryUsed;
+ bool mGotParcelMemoryUsedDetails;
+ bool mGotParcelMemoryMax;
S32 mParcelMemoryMax;
S32 mParcelMemoryUsed;
S32 mParcelMemoryUsedDetails;
- BOOL mGotParcelURLsUsed;
- BOOL mGotParcelURLsUsedDetails;
- BOOL mGotParcelURLsMax;
+ bool mGotParcelURLsUsed;
+ bool mGotParcelURLsUsedDetails;
+ bool mGotParcelURLsMax;
S32 mParcelURLsMax;
S32 mParcelURLsUsed;
S32 mParcelURLsUsedDetails;
@@ -217,7 +217,21 @@ class LLPanelScriptLimitsAttachment : public LLPanelScriptLimitsInfo
public:
LLPanelScriptLimitsAttachment()
- : LLPanelScriptLimitsInfo() {};
+ : LLPanelScriptLimitsInfo(),
+ mGotAttachmentMemoryUsed(false),
+ mGotAttachmentMemoryUsedDetails(false),
+ mGotAttachmentMemoryMax(false),
+ mAttachmentMemoryMax(0),
+ mAttachmentMemoryUsed(0),
+ mAttachmentMemoryUsedDetails(0),
+ mGotAttachmentURLsUsed(false),
+ mGotAttachmentURLsUsedDetails(false),
+ mGotAttachmentURLsMax(false),
+ mAttachmentURLsMax(0),
+ mAttachmentURLsUsed(0),
+ mAttachmentURLsUsedDetails(0)
+ {};
+
~LLPanelScriptLimitsAttachment()
{
};
@@ -233,16 +247,16 @@ public:
private:
- BOOL mGotAttachmentMemoryUsed;
- BOOL mGotAttachmentMemoryUsedDetails;
- BOOL mGotAttachmentMemoryMax;
+ bool mGotAttachmentMemoryUsed;
+ bool mGotAttachmentMemoryUsedDetails;
+ bool mGotAttachmentMemoryMax;
S32 mAttachmentMemoryMax;
S32 mAttachmentMemoryUsed;
S32 mAttachmentMemoryUsedDetails;
- BOOL mGotAttachmentURLsUsed;
- BOOL mGotAttachmentURLsUsedDetails;
- BOOL mGotAttachmentURLsMax;
+ bool mGotAttachmentURLsUsed;
+ bool mGotAttachmentURLsUsedDetails;
+ bool mGotAttachmentURLsMax;
S32 mAttachmentURLsMax;
S32 mAttachmentURLsUsed;
S32 mAttachmentURLsUsedDetails;
diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp
index e2b0c4b66f..9895665026 100644
--- a/indra/newview/llfloatersellland.cpp
+++ b/indra/newview/llfloatersellland.cpp
@@ -163,7 +163,7 @@ BOOL LLFloaterSellLandUI::postBuild()
{
childSetCommitCallback("sell_to", onChangeValue, this);
childSetCommitCallback("price", onChangeValue, this);
- childSetPrevalidate("price", LLLineEditor::prevalidateNonNegativeS32);
+ childSetPrevalidate("price", LLTextValidate::validateNonNegativeS32);
childSetCommitCallback("sell_objects", onChangeValue, this);
childSetAction("sell_to_select_agent", boost::bind( &LLFloaterSellLandUI::doSelectAgent, this));
childSetAction("cancel_btn", doCancel, this);
@@ -268,7 +268,7 @@ void LLFloaterSellLandUI::refreshUI()
std::string price_str = childGetValue("price").asString();
bool valid_price = false;
- valid_price = (price_str != "") && LLLineEditor::prevalidateNonNegativeS32(utf8str_to_wstring(price_str));
+ valid_price = (price_str != "") && LLTextValidate::validateNonNegativeS32(utf8str_to_wstring(price_str));
if (valid_price && mParcelActualArea > 0)
{
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 4edd09b02c..94facb6b20 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -423,7 +423,7 @@ void LLFloaterTools::refresh()
LLResMgr::getInstance()->getIntegerString(obj_count_string, LLSelectMgr::getInstance()->getSelection()->getRootObjectCount());
childSetTextArg("obj_count", "[COUNT]", obj_count_string);
std::string prim_count_string;
- LLResMgr::getInstance()->getIntegerString(prim_count_string, LLSelectMgr::getInstance()->getSelection()->getObjectCount());
+ LLResMgr::getInstance()->getIntegerString(prim_count_string, LLSelectMgr::getInstance()->getSelection()->getObjectCount(TRUE));
childSetTextArg("prim_count", "[COUNT]", prim_count_string);
// calculate selection rendering cost
@@ -666,8 +666,8 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
if (mCheckCopyCenters) mCheckCopyCenters ->setVisible( create_visible );
if (mCheckCopyRotates) mCheckCopyRotates ->setVisible( create_visible );
- if (mCheckCopyCenters) mCheckCopyCenters->setEnabled( mCheckCopySelection->get() );
- if (mCheckCopyRotates) mCheckCopyRotates->setEnabled( mCheckCopySelection->get() );
+ if (mCheckCopyCenters && mCheckCopySelection) mCheckCopyCenters->setEnabled( mCheckCopySelection->get() );
+ if (mCheckCopyRotates && mCheckCopySelection) mCheckCopyRotates->setEnabled( mCheckCopySelection->get() );
// Land buttons
BOOL land_visible = (tool == LLToolBrushLand::getInstance() || tool == LLToolSelectLand::getInstance() );
diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index c6e12476bd..f61c86db14 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -41,6 +41,7 @@
#include "llfloateruipreview.h" // Own header
// Internal utility
+#include "lleventtimer.h"
#include "llrender.h"
#include "llsdutil.h"
#include "llxmltree.h"
@@ -91,7 +92,6 @@ static std::string get_xui_dir()
}
// Forward declarations to avoid header dependencies
-class LLEventTimer;
class LLColor;
class LLScrollListCtrl;
class LLComboBox;
@@ -362,8 +362,7 @@ BOOL LLFadeEventTimer::tick()
if(NULL == mParent) // no more need to tick, so suicide
{
- delete this;
- return FALSE;
+ return TRUE;
}
// Set up colors
diff --git a/indra/newview/llfloaterwater.cpp b/indra/newview/llfloaterwater.cpp
index 66a1f6701f..1bbee2625c 100644
--- a/indra/newview/llfloaterwater.cpp
+++ b/indra/newview/llfloaterwater.cpp
@@ -574,12 +574,10 @@ bool LLFloaterWater::deleteAlertCallback(const LLSD& notification, const LLSD& r
LLComboBox* combo_box = getChild<LLComboBox>("WaterPresetsCombo");
LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");
LLComboBox* key_combo = NULL;
- LLMultiSliderCtrl* mult_sldr = NULL;
if (day_cycle)
{
key_combo = day_cycle->getChild<LLComboBox>("WaterKeyPresets");
- mult_sldr = day_cycle->getChild<LLMultiSliderCtrl>("WaterDayCycleKeys");
}
std::string name = combo_box->getSelectedValue().asString();
diff --git a/indra/newview/llfloaterwindlight.cpp b/indra/newview/llfloaterwindlight.cpp
index ea6fda7303..c1b15c578c 100644
--- a/indra/newview/llfloaterwindlight.cpp
+++ b/indra/newview/llfloaterwindlight.cpp
@@ -749,12 +749,10 @@ bool LLFloaterWindLight::deleteAlertCallback(const LLSD& notification, const LLS
LLComboBox* combo_box = getChild<LLComboBox>("WLPresetsCombo");
LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");
LLComboBox* key_combo = NULL;
- LLMultiSliderCtrl* mult_sldr = NULL;
if (day_cycle)
{
key_combo = day_cycle->getChild<LLComboBox>("WLKeyPresets");
- mult_sldr = day_cycle->getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
}
std::string name(combo_box->getSelectedValue().asString());
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 5c65b2c293..8dbdfff635 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -195,7 +195,8 @@ LLFolderView::LLFolderView(const Params& p)
mCallbackRegistrar(NULL),
mParentPanel(p.parent_panel),
mUseEllipses(false),
- mDraggingOverItem(NULL)
+ mDraggingOverItem(NULL),
+ mStatusTextBox(NULL)
{
LLRect rect = p.rect;
LLRect new_rect(rect.mLeft, rect.mBottom + getRect().getHeight(), rect.mLeft + getRect().getWidth(), rect.mBottom);
@@ -225,12 +226,24 @@ LLFolderView::LLFolderView(const Params& p)
params.font(getLabelFontForStyle(LLFontGL::NORMAL));
params.max_length_bytes(DB_INV_ITEM_NAME_STR_LEN);
params.commit_callback.function(boost::bind(&LLFolderView::commitRename, this, _2));
- params.prevalidate_callback(&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ params.prevalidate_callback(&LLTextValidate::validateASCIIPrintableNoPipe);
params.commit_on_focus_lost(true);
params.visible(false);
mRenamer = LLUICtrlFactory::create<LLLineEditor> (params);
addChild(mRenamer);
+ // Textbox
+ LLTextBox::Params text_p;
+ LLRect new_r(5, 13-50, 300, 0-50);
+ text_p.name(std::string(p.name));
+ text_p.rect(new_r);
+ text_p.font(getLabelFontForStyle(mLabelStyle));
+ text_p.visible(false);
+ text_p.allow_html(true);
+ mStatusTextBox = LLUICtrlFactory::create<LLTextBox> (text_p);
+ //addChild(mStatusTextBox);
+
+
// make the popup menu available
LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
if (!menu)
@@ -253,6 +266,7 @@ LLFolderView::~LLFolderView( void )
mScrollContainer = NULL;
mRenameItem = NULL;
mRenamer = NULL;
+ mStatusTextBox = NULL;
if( gEditMenuHandler == this )
{
@@ -874,7 +888,7 @@ void LLFolderView::draw()
LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
- LLFontGL* font = getLabelFontForStyle(mLabelStyle);
+ //LLFontGL* font = getLabelFontForStyle(mLabelStyle);
// if cursor has moved off of me during drag and drop
// close all auto opened folders
@@ -911,19 +925,23 @@ void LLFolderView::draw()
|| mFilter->getShowFolderState() == LLInventoryFilter::SHOW_ALL_FOLDERS)
{
mStatusText.clear();
+ mStatusTextBox->setVisible( FALSE );
}
else
{
if (gInventory.backgroundFetchActive() || mCompletedFilterGeneration < mFilter->getMinRequiredGeneration())
{
mStatusText = LLTrans::getString("Searching");
- font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
+ //font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
else
{
mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage());
- font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
+ //font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
+ mStatusTextBox->setValue(mStatusText);
+ mStatusTextBox->setVisible( TRUE );
+
}
LLFolderViewFolder::draw();
diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h
index 56ebdfcf79..faf6a9cf23 100644
--- a/indra/newview/llfolderview.h
+++ b/indra/newview/llfolderview.h
@@ -62,6 +62,7 @@ class LLLineEditor;
class LLMenuGL;
class LLScrollContainer;
class LLUICtrl;
+class LLTextBox;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLFolderViewFunctor
@@ -327,7 +328,7 @@ protected:
LLUUID mSelectThisID; // if non null, select this item
- LLPanel* mParentPanel;
+ LLPanel* mParentPanel;
/**
* Is used to determine if we need to cut text In LLFolderViewItem to avoid horizontal scroll.
@@ -344,6 +345,8 @@ protected:
public:
static F32 sAutoOpenTime;
+ LLTextBox* mStatusTextBox;
+
};
bool sort_item_name(LLFolderViewItem* a, LLFolderViewItem* b);
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index f154de39c9..76607e4874 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -1339,10 +1339,6 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
if (folder->getFiltered() || folder->hasFilteredDescendants(filter.getMinRequiredGeneration()))
{
mMostFilteredDescendantGeneration = filter_generation;
- if (getRoot()->needsAutoSelect() && autoopen_folders)
- {
- folder->setOpenArrangeRecursively(TRUE);
- }
}
// just skip it, it has already been filtered
continue;
@@ -1859,10 +1855,9 @@ EInventorySortGroup LLFolderViewFolder::getSortGroup() const
return SG_TRASH_FOLDER;
}
- // Folders that can't be moved are 'system' folders.
if( mListener )
{
- if( !(mListener->isItemMovable()) )
+ if(LLFolderType::lookupIsProtectedType(mListener->getPreferredType()))
{
return SG_SYSTEM_FOLDER;
}
@@ -2548,8 +2543,12 @@ bool LLInventorySort::operator()(const LLFolderViewItem* const& a, const LLFolde
{
// *TODO: mantipov: probably it is better to add an appropriate method to LLFolderViewItem
// or to LLInvFVBridge
- S32 a_sort = (static_cast<const LLItemBridge*>(a->getListener()))->getItem()->getSortField();
- S32 b_sort = (static_cast<const LLItemBridge*>(b->getListener()))->getItem()->getSortField();
+ LLViewerInventoryItem* aitem = (static_cast<const LLItemBridge*>(a->getListener()))->getItem();
+ LLViewerInventoryItem* bitem = (static_cast<const LLItemBridge*>(b->getListener()))->getItem();
+ if (!aitem || !bitem)
+ return false;
+ S32 a_sort = aitem->getSortField();
+ S32 b_sort = bitem->getSortField();
return a_sort < b_sort;
}
}
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index 4c1019a882..4db75bbd8a 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -677,9 +677,12 @@ void LLGroupMgrGroupData::sendRoleChanges()
break;
}
case RC_UPDATE_ALL:
+ // fall through
case RC_UPDATE_POWERS:
need_power_recalc = true;
+ // fall through
case RC_UPDATE_DATA:
+ // fall through
default:
{
LLGroupRoleData* group_role_data = (*role_it).second;
@@ -762,7 +765,7 @@ void LLGroupMgr::addObserver(LLGroupMgrObserver* observer)
mObservers.insert(std::pair<LLUUID, LLGroupMgrObserver*>(observer->getID(), observer));
}
-void LLGroupMgr::addObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer)
+void LLGroupMgr::addObserver(const LLUUID& group_id, LLParticularGroupObserver* observer)
{
if(group_id.notNull() && observer)
{
@@ -792,7 +795,7 @@ void LLGroupMgr::removeObserver(LLGroupMgrObserver* observer)
}
}
-void LLGroupMgr::removeObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer)
+void LLGroupMgr::removeObserver(const LLUUID& group_id, LLParticularGroupObserver* observer)
{
if(group_id.isNull() || !observer)
{
@@ -1364,7 +1367,7 @@ void LLGroupMgr::notifyObservers(LLGroupChange gc)
gi->second->mChanged = FALSE;
- // notify LLParticularGroupMgrObserver
+ // notify LLParticularGroupObserver
observer_map_t::iterator obs_it = mParticularObservers.find(group_id);
if(obs_it == mParticularObservers.end())
return;
diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h
index 588b4a9034..2c86de8b97 100644
--- a/indra/newview/llgroupmgr.h
+++ b/indra/newview/llgroupmgr.h
@@ -53,10 +53,10 @@ protected:
LLUUID mID;
};
-class LLParticularGroupMgrObserver
+class LLParticularGroupObserver
{
public:
- virtual ~LLParticularGroupMgrObserver(){}
+ virtual ~LLParticularGroupObserver(){}
virtual void changed(const LLUUID& group_id, LLGroupChange gc) = 0;
};
@@ -313,9 +313,9 @@ public:
~LLGroupMgr();
void addObserver(LLGroupMgrObserver* observer);
- void addObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer);
+ void addObserver(const LLUUID& group_id, LLParticularGroupObserver* observer);
void removeObserver(LLGroupMgrObserver* observer);
- void removeObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer);
+ void removeObserver(const LLUUID& group_id, LLParticularGroupObserver* observer);
LLGroupMgrGroupData* getGroupData(const LLUUID& id);
void sendGroupPropertiesRequest(const LLUUID& group_id);
@@ -374,7 +374,7 @@ private:
typedef std::map<LLUUID, LLGroupMgrGroupData*> group_map_t;
group_map_t mGroups;
- typedef std::set<LLParticularGroupMgrObserver*> observer_set_t;
+ typedef std::set<LLParticularGroupObserver*> observer_set_t;
typedef std::map<LLUUID,observer_set_t> observer_map_t;
observer_map_t mParticularObservers;
};
diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp
index 8d1d27444b..9ed5d13831 100644
--- a/indra/newview/llhudtext.cpp
+++ b/indra/newview/llhudtext.cpp
@@ -567,6 +567,18 @@ void LLHUDText::setStringUTF8(const std::string &wtext)
setString(utf8str_to_wstring(wtext));
}
+std::string LLHUDText::getString()
+{
+ std::ostringstream ostr;
+ for (U32 i = 0; i < mTextSegments.size(); ++i)
+ {
+ const std::string str = wstring_to_utf8str(mTextSegments[i].getText());
+ ostr << str;
+ }
+
+ return ostr.str();
+}
+
void LLHUDText::setString(const LLWString &wtext)
{
mTextSegments.clear();
diff --git a/indra/newview/llhudtext.h b/indra/newview/llhudtext.h
index dc14a8c764..4787a15eaf 100644
--- a/indra/newview/llhudtext.h
+++ b/indra/newview/llhudtext.h
@@ -90,6 +90,7 @@ public:
public:
void setStringUTF8(const std::string &utf8string);
+ std::string getString();
void setString(const LLWString &wstring);
void clearString();
void addLine(const std::string &text, const LLColor4& color, const LLFontGL::StyleFlags style = LLFontGL::NORMAL);
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 1eac90371d..94b540a7e1 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -271,6 +271,7 @@ BOOL LLIMFloater::postBuild()
mInputEditor->setCommitOnFocusLost( FALSE );
mInputEditor->setRevertOnEsc( FALSE );
mInputEditor->setReplaceNewlinesWithSpaces( FALSE );
+ mInputEditor->setPassDelete( TRUE );
std::string session_name(LLIMModel::instance().getName(mSessionID));
@@ -407,12 +408,7 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
}
}
- if (floater_container)
- {
- //selecting the panel resets a chiclet's counter
- floater_container->selectFloater(floater);
- floater_container->setVisible(TRUE);
- }
+ floater->openFloater(floater->getKey());
}
else
{
@@ -515,8 +511,11 @@ BOOL LLIMFloater::getVisible()
if(isChatMultiTab())
{
LLIMFloaterContainer* im_container = LLIMFloaterContainer::getInstance();
+
+ // Treat inactive floater as invisible.
+ bool is_active = im_container->getActiveFloater() == this;
// getVisible() returns TRUE when Tabbed IM window is minimized.
- return !im_container->isMinimized() && im_container->getVisible();
+ return is_active && !im_container->isMinimized() && im_container->getVisible();
}
else
{
diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp
index 22eb9a51d2..49521b5987 100644
--- a/indra/newview/llimfloatercontainer.cpp
+++ b/indra/newview/llimfloatercontainer.cpp
@@ -37,6 +37,7 @@
#include "llfloaterreg.h"
#include "llimview.h"
#include "llavatariconctrl.h"
+#include "llgroupiconctrl.h"
#include "llagent.h"
//
@@ -90,80 +91,34 @@ void LLIMFloaterContainer::addFloater(LLFloater* floaterp,
LLUUID session_id = floaterp->getKey();
- if(gAgent.isInGroup(session_id))
+ LLIconCtrl* icon = 0;
+
+ if(gAgent.isInGroup(session_id, TRUE))
{
+ LLGroupIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLGroupIconCtrl>();
+ icon_params.group_id = session_id;
+ icon = LLUICtrlFactory::instance().createWidget<LLGroupIconCtrl>(icon_params);
+
mSessions[session_id] = floaterp;
- LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(session_id);
- LLGroupMgr* gm = LLGroupMgr::getInstance();
- gm->addObserver(session_id, this);
floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, session_id));
-
- if (group_data && group_data->mInsigniaID.notNull())
- {
- mTabContainer->setTabImage(get_ptr_in_map(mSessions, session_id), group_data->mInsigniaID);
- }
- else
- {
- mTabContainer->setTabImage(floaterp, "Generic_Group");
- gm->sendGroupPropertiesRequest(session_id);
- }
}
else
{
LLUUID avatar_id = LLIMModel::getInstance()->getOtherParticipantID(session_id);
- LLAvatarPropertiesProcessor& app = LLAvatarPropertiesProcessor::instance();
- app.addObserver(avatar_id, this);
- floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, avatar_id));
- mSessions[avatar_id] = floaterp;
- LLUUID* icon_id_ptr = LLAvatarIconIDCache::getInstance()->get(avatar_id);
- if(icon_id_ptr && icon_id_ptr->notNull())
- {
- mTabContainer->setTabImage(floaterp, *icon_id_ptr);
- }
- else
- {
- mTabContainer->setTabImage(floaterp, "Generic_Person");
- app.sendAvatarPropertiesRequest(avatar_id);
- }
- }
-}
+ LLAvatarIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLAvatarIconCtrl>();
+ icon_params.avatar_id = avatar_id;
+ icon = LLUICtrlFactory::instance().createWidget<LLAvatarIconCtrl>(icon_params);
-void LLIMFloaterContainer::processProperties(void* data, enum EAvatarProcessorType type)
-{
- if (APT_PROPERTIES == type)
- {
- LLAvatarData* avatar_data = static_cast<LLAvatarData*>(data);
- if (avatar_data)
- {
- LLUUID avatar_id = avatar_data->avatar_id;
- LLUUID* cached_avatarId = LLAvatarIconIDCache::getInstance()->get(avatar_id);
- if(cached_avatarId && cached_avatarId->notNull() && avatar_data->image_id != *cached_avatarId)
- {
- LLAvatarIconIDCache::getInstance()->add(avatar_id,avatar_data->image_id);
- mTabContainer->setTabImage(get_ptr_in_map(mSessions, avatar_id), avatar_data->image_id);
- }
- }
- }
-}
-
-void LLIMFloaterContainer::changed(const LLUUID& group_id, LLGroupChange gc)
-{
- if (GC_PROPERTIES == gc)
- {
- LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(group_id);
- if (group_data && group_data->mInsigniaID.notNull())
- {
- mTabContainer->setTabImage(get_ptr_in_map(mSessions, group_id), group_data->mInsigniaID);
- }
+ mSessions[avatar_id] = floaterp;
+ floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, avatar_id));
}
+ mTabContainer->setTabImage(floaterp, icon);
}
-void LLIMFloaterContainer::onCloseFloater(LLUUID id)
+void LLIMFloaterContainer::onCloseFloater(LLUUID& id)
{
- LLAvatarPropertiesProcessor::instance().removeObserver(id, this);
- LLGroupMgr::instance().removeObserver(id, this);
-
+ mSessions.erase(id);
}
void LLIMFloaterContainer::onNewMessageReceived(const LLSD& data)
diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h
index bc06f0cbd3..46c0617c01 100644
--- a/indra/newview/llimfloatercontainer.h
+++ b/indra/newview/llimfloatercontainer.h
@@ -43,7 +43,7 @@
class LLTabContainer;
-class LLIMFloaterContainer : public LLMultiFloater, public LLAvatarPropertiesObserver, public LLParticularGroupMgrObserver
+class LLIMFloaterContainer : public LLMultiFloater
{
public:
LLIMFloaterContainer(const LLSD& seed);
@@ -51,14 +51,12 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
+ void onCloseFloater(LLUUID& id);
/*virtual*/ void addFloater(LLFloater* floaterp,
BOOL select_added_floater,
LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END);
- void processProperties(void* data, EAvatarProcessorType type);
- void changed(const LLUUID& group_id, LLGroupChange gc);
-
static LLFloater* getCurrentVoiceFloater();
static LLIMFloaterContainer* findInstance();
@@ -69,7 +67,6 @@ private:
typedef std::map<LLUUID,LLFloater*> avatarID_panel_map_t;
avatarID_panel_map_t mSessions;
- void onCloseFloater(LLUUID avatar_id);
void onNewMessageReceived(const LLSD& data);
};
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 0c64c2b032..77e3012d26 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -77,6 +77,9 @@ const static std::string IM_FROM_ID("from_id");
const static std::string NO_SESSION("(IM Session Doesn't Exist)");
const static std::string ADHOC_NAME_SUFFIX(" Conference");
+const static std::string NEARBY_P2P_BY_OTHER("nearby_P2P_by_other");
+const static std::string NEARBY_P2P_BY_AGENT("nearby_P2P_by_agent");
+
std::string LLCallDialogManager::sPreviousSessionlName = "";
LLIMModel::LLIMSession::SType LLCallDialogManager::sPreviousSessionType = LLIMModel::LLIMSession::P2P_SESSION;
std::string LLCallDialogManager::sCurrentSessionlName = "";
@@ -253,12 +256,12 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
{
case LLVoiceChannel::STATE_CALL_STARTED :
message = other_avatar_name + " " + started_call;
- LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
break;
case LLVoiceChannel::STATE_CONNECTED :
message = you + " " + joined_call;
- LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
default:
break;
}
@@ -269,11 +272,11 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
{
case LLVoiceChannel::STATE_CALL_STARTED :
message = you + " " + started_call;
- LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
break;
case LLVoiceChannel::STATE_CONNECTED :
message = other_avatar_name + " " + joined_call;
- LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
default:
break;
}
@@ -288,7 +291,7 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
{
case LLVoiceChannel::STATE_CONNECTED :
message = you + " " + joined_call;
- LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
default:
break;
}
@@ -299,7 +302,7 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
{
case LLVoiceChannel::STATE_CALL_STARTED :
message = you + " " + started_call;
- LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
break;
default:
break;
@@ -1372,7 +1375,7 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id)
}
sSession = session;
- sSession->mVoiceChannel->setStateChangedCallback(boost::bind(LLCallDialogManager::onVoiceChannelStateChanged, _1, _2, _3));
+ sSession->mVoiceChannel->setStateChangedCallback(boost::bind(LLCallDialogManager::onVoiceChannelStateChanged, _1, _2, _3, _4));
if(sCurrentSessionlName != session->mName)
{
sPreviousSessionlName = sCurrentSessionlName;
@@ -1403,7 +1406,7 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id)
}
-void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction)
+void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction, bool ended_by_agent)
{
LLSD mCallDialogPayload;
LLOutgoingCallDialog* ocd = NULL;
@@ -1423,6 +1426,7 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
mCallDialogPayload["state"] = new_state;
mCallDialogPayload["disconnected_channel_name"] = sSession->mName;
mCallDialogPayload["session_type"] = sSession->mSessionType;
+ mCallDialogPayload["ended_by_agent"] = ended_by_agent;
switch(new_state)
{
@@ -1517,6 +1521,15 @@ void LLCallDialog::draw()
}
}
+// virtual
+void LLCallDialog::onOpen(const LLSD& key)
+{
+ LLDockableFloater::onOpen(key);
+
+ // it should be over the all floaters. EXT-5116
+ gFloaterView->bringToFront(this);
+}
+
void LLCallDialog::setIcon(const LLSD& session_id, const LLSD& participant_id)
{
// *NOTE: 12/28/2009: check avaline calls: LLVoiceClient::isParticipantAvatar returns false for them
@@ -1609,7 +1622,16 @@ void LLOutgoingCallDialog::show(const LLSD& key)
channel_name = LLTextUtil::formatPhoneNumber(channel_name);
}
childSetTextArg("nearby", "[VOICE_CHANNEL_NAME]", channel_name);
- childSetTextArg("nearby_P2P", "[VOICE_CHANNEL_NAME]", mPayload["disconnected_channel_name"].asString());
+ childSetTextArg("nearby_P2P_by_other", "[VOICE_CHANNEL_NAME]", mPayload["disconnected_channel_name"].asString());
+
+ // skipping "You will now be reconnected to nearby" in notification when call is ended by disabling voice,
+ // so no reconnection to nearby chat happens (EXT-4397)
+ bool voice_works = LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking();
+ std::string reconnect_nearby = voice_works ? LLTrans::getString("reconnect_nearby") : std::string();
+ childSetTextArg("nearby", "[RECONNECT_NEARBY]", reconnect_nearby);
+
+ const std::string& nearby_str = mPayload["ended_by_agent"] ? NEARBY_P2P_BY_AGENT : NEARBY_P2P_BY_OTHER;
+ childSetTextArg(nearby_str, "[RECONNECT_NEARBY]", reconnect_nearby);
}
std::string callee_name = mPayload["session_name"].asString();
@@ -1643,6 +1665,7 @@ void LLOutgoingCallDialog::show(const LLSD& key)
{
case LLVoiceChannel::STATE_CALL_STARTED :
getChild<LLTextBox>("calling")->setVisible(true);
+ getChild<LLButton>("Cancel")->setVisible(true);
if(show_oldchannel)
{
getChild<LLTextBox>("leaving")->setVisible(true);
@@ -1664,7 +1687,8 @@ void LLOutgoingCallDialog::show(const LLSD& key)
case LLVoiceChannel::STATE_HUNG_UP :
if (mPayload["session_type"].asInteger() == LLIMModel::LLIMSession::P2P_SESSION)
{
- getChild<LLTextBox>("nearby_P2P")->setVisible(true);
+ const std::string& nearby_str = mPayload["ended_by_agent"] ? NEARBY_P2P_BY_AGENT : NEARBY_P2P_BY_OTHER;
+ getChild<LLTextBox>(nearby_str)->setVisible(true);
}
else
{
@@ -1683,7 +1707,8 @@ void LLOutgoingCallDialog::hideAllText()
getChild<LLTextBox>("calling")->setVisible(false);
getChild<LLTextBox>("leaving")->setVisible(false);
getChild<LLTextBox>("connecting")->setVisible(false);
- getChild<LLTextBox>("nearby_P2P")->setVisible(false);
+ getChild<LLTextBox>("nearby_P2P_by_other")->setVisible(false);
+ getChild<LLTextBox>("nearby_P2P_by_agent")->setVisible(false);
getChild<LLTextBox>("nearby")->setVisible(false);
getChild<LLTextBox>("noanswer")->setVisible(false);
}
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 1c7aaa3f1b..ad6cede727 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -452,7 +452,7 @@ public:
static void initClass();
static void onVoiceChannelChanged(const LLUUID &session_id);
- static void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction);
+ static void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction, bool ended_by_agent);
protected:
static std::string sPreviousSessionlName;
@@ -472,6 +472,7 @@ public:
// check timer state
/*virtual*/ void draw();
+ /*virtual*/ void onOpen(const LLSD& key);
protected:
// lifetime timer for a notification
diff --git a/indra/newview/llinspect.cpp b/indra/newview/llinspect.cpp
index c7b651f37c..81cfce53b1 100644
--- a/indra/newview/llinspect.cpp
+++ b/indra/newview/llinspect.cpp
@@ -32,6 +32,7 @@
#include "llinspect.h"
+#include "lltooltip.h"
#include "llcontrol.h" // LLCachedControl
#include "llui.h" // LLUI::sSettingsGroups
#include "llviewermenu.h"
@@ -104,6 +105,26 @@ BOOL LLInspect::handleHover(S32 x, S32 y, MASK mask)
return LLView::handleHover(x, y, mask);
}
+BOOL LLInspect::handleToolTip(S32 x, S32 y, MASK mask)
+{
+ BOOL handled = FALSE;
+
+
+ //delegate handling of tooltip to the hovered child
+ LLView* child_handler = childFromPoint(x,y);
+ if (child_handler && !child_handler->getToolTip().empty())// show tooltip if a view has non-empty tooltip message
+ {
+ //build LLInspector params to get correct tooltip setting, etc. background image
+ LLInspector::Params params;
+ params.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
+ params.message = child_handler->getToolTip();
+ //set up delay if there is no visible tooltip at this moment
+ params.delay_time = LLToolTipMgr::instance().toolTipVisible() ? 0.f : LLUI::sSettingGroups["config"]->getF32( "ToolTipDelay" );
+ LLToolTipMgr::instance().show(params);
+ handled = TRUE;
+ }
+ return handled;
+}
// virtual
void LLInspect::onMouseLeave(S32 x, S32 y, MASK mask)
{
diff --git a/indra/newview/llinspect.h b/indra/newview/llinspect.h
index f8c86618d2..6d994a8d7c 100644
--- a/indra/newview/llinspect.h
+++ b/indra/newview/llinspect.h
@@ -47,6 +47,7 @@ public:
/*virtual*/ void draw();
/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask);
/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
/// Start open animation
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 19fbd7ade1..d0ef159228 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -125,7 +125,9 @@ std::string ICON_NAME[ICON_NAME_COUNT] =
"Inv_Gesture",
"Inv_LinkItem",
- "Inv_LinkFolder"
+ "Inv_LinkFolder",
+
+ "Inv_Mesh"
};
// +=================================================+
@@ -470,7 +472,9 @@ void hide_context_entries(LLMenuGL& menu,
{
const LLView::child_list_t *list = menu.getChildList();
- BOOL is_previous_entry_separator = FALSE;
+ // For removing double separators or leading separator. Start at true so that
+ // if the first element is a separator, it will not be shown.
+ BOOL is_previous_entry_separator = TRUE;
LLView::child_list_t::const_iterator itor;
for (itor = list->begin(); itor != list->end(); ++itor)
@@ -582,8 +586,12 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
}
}
- items.push_back(std::string("Paste"));
- if (!isClipboardPasteable() || (flags & FIRST_SELECTED_ITEM) == 0)
+ // Don't allow items to be pasted directly into the COF.
+ if (!isCOFFolder())
+ {
+ items.push_back(std::string("Paste"));
+ }
+ if (!isClipboardPasteable() || ((flags & FIRST_SELECTED_ITEM) == 0))
{
disabled_items.push_back(std::string("Paste"));
}
@@ -781,7 +789,7 @@ void LLInvFVBridge::changeItemParent(LLInventoryModel* model,
const LLUUID& new_parent_id,
BOOL restamp)
{
- if(item->getParentUUID() != new_parent_id)
+ if (item->getParentUUID() != new_parent_id)
{
LLInventoryModel::update_list_t update;
LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1);
@@ -947,6 +955,14 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
// Only should happen for broken links.
new_listener = new LLLinkItemBridge(inventory, uuid);
break;
+ case LLAssetType::AT_MESH:
+ if(!(inv_type == LLInventoryType::IT_MESH))
+ {
+ llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+ }
+ new_listener = new LLMeshBridge(inventory, uuid);
+ break;
+
default:
llinfos << "Unhandled asset type (llassetstorage.h): "
<< (S32)asset_type << llendl;
@@ -1107,6 +1123,9 @@ void LLItemBridge::restoreItem()
void LLItemBridge::restoreToWorld()
{
+ //Similar functionality to the drag and drop rez logic
+ bool remove_from_inventory = false;
+
LLViewerInventoryItem* itemp = (LLViewerInventoryItem*)getItem();
if (itemp)
{
@@ -1119,23 +1138,20 @@ void LLItemBridge::restoreToWorld()
msg->nextBlockFast(_PREHASH_InventoryData);
itemp->packMessage(msg);
msg->sendReliable(gAgent.getRegion()->getHost());
- }
- //Similar functionality to the drag and drop rez logic
- BOOL remove_from_inventory = FALSE;
-
- //remove local inventory copy, sim will deal with permissions and removing the item
- //from the actual inventory if its a no-copy etc
- if(!itemp->getPermissions().allowCopyBy(gAgent.getID()))
- {
- remove_from_inventory = TRUE;
- }
-
- // Check if it's in the trash. (again similar to the normal rez logic)
- const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id))
- {
- remove_from_inventory = TRUE;
+ //remove local inventory copy, sim will deal with permissions and removing the item
+ //from the actual inventory if its a no-copy etc
+ if(!itemp->getPermissions().allowCopyBy(gAgent.getID()))
+ {
+ remove_from_inventory = true;
+ }
+
+ // Check if it's in the trash. (again similar to the normal rez logic)
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id))
+ {
+ remove_from_inventory = true;
+ }
}
if(remove_from_inventory)
@@ -1521,7 +1537,7 @@ BOOL LLFolderBridge::isUpToDate() const
BOOL LLFolderBridge::isItemCopyable() const
{
- return TRUE;
+ return FALSE;
}
BOOL LLFolderBridge::copyToClipboard() const
@@ -2226,7 +2242,10 @@ void LLFolderBridge::determineFolderType()
{
LLInventoryModel* model = getInventoryModel();
LLViewerInventoryCategory* category = model->getCategory(mUUID);
- category->determineFolderType();
+ if (category)
+ {
+ category->determineFolderType();
+ }
}
}
@@ -2286,6 +2305,9 @@ LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type)
return LLUI::getUIImage("Inv_LookFolderClosed");
}
return LLUI::getUIImage("Inv_FolderClosed");
+ /*case LLAssetType::AT_MESH:
+ control = "inv_folder_mesh.tga";
+ break;*/
}
LLUIImagePtr LLFolderBridge::getOpenIcon() const
@@ -2423,7 +2445,12 @@ void LLFolderBridge::pasteFromClipboard()
{
// move_inventory_item() is not enough,
//we have to update inventory locally too
- changeItemParent(model, dynamic_cast<LLViewerInventoryItem*>(item), parent_id, FALSE);
+ LLViewerInventoryItem* viitem = dynamic_cast<LLViewerInventoryItem*>(item);
+ llassert(viitem);
+ if (viitem)
+ {
+ changeItemParent(model, viitem, parent_id, FALSE);
+ }
}
else
{
@@ -2495,11 +2522,13 @@ void LLFolderBridge::folderOptionsMenu()
if(!model) return;
const LLInventoryCategory* category = model->getCategory(mUUID);
+ if(!category) return;
+
LLFolderType::EType type = category->getPreferredType();
- const bool is_system_folder = category && LLFolderType::lookupIsProtectedType(type);
+ const bool is_system_folder = LLFolderType::lookupIsProtectedType(type);
// BAP change once we're no longer treating regular categories as ensembles.
- const bool is_ensemble = category && (type == LLFolderType::FT_NONE ||
- LLFolderType::lookupIsEnsembleType(type));
+ const bool is_ensemble = (type == LLFolderType::FT_NONE ||
+ LLFolderType::lookupIsEnsembleType(type));
// calling card related functionality for folders.
@@ -2779,6 +2808,7 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,
case DAD_ANIMATION:
case DAD_GESTURE:
case DAD_LINK:
+ case DAD_MESH:
accept = dragItemIntoFolder((LLInventoryItem*)cargo_data,
drop);
break;
@@ -2996,7 +3026,6 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
LLViewerObject* object = NULL;
if(LLToolDragAndDrop::SOURCE_AGENT == source)
{
-
BOOL is_movable = TRUE;
switch( inv_item->getActualType() )
{
@@ -3008,11 +3037,18 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
}
const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
- BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id);
+ const BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id);
const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
- BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
- BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);
+ const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
+ const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);
+ const BOOL move_is_outof_current_outfit = LLAppearanceManager::instance().getIsInCOF(inv_item->getUUID());
+ // Can't explicitly drag things out of the COF.
+ if (move_is_outof_current_outfit)
+ {
+ is_movable = FALSE;
+ }
+
if(is_movable && move_is_into_trash)
{
is_movable = inv_item->getIsLinkType() || !get_is_item_worn(inv_item->getUUID());
@@ -3615,9 +3651,13 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
LLInventoryItem* item = getItem();
BOOL good_card = (item
- && (LLUUID::null != item->getCreatorUUID())
- && (item->getCreatorUUID() != gAgent.getID()));
- BOOL user_online = (LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()));
+ && (LLUUID::null != item->getCreatorUUID())
+ && (item->getCreatorUUID() != gAgent.getID()));
+ BOOL user_online = FALSE;
+ if (item)
+ {
+ user_online = (LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()));
+ }
items.push_back(std::string("Send Instant Message Separator"));
items.push_back(std::string("Send Instant Message"));
items.push_back(std::string("Offer Teleport..."));
@@ -3657,6 +3697,7 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
case DAD_BODYPART:
case DAD_ANIMATION:
case DAD_GESTURE:
+ case DAD_MESH:
{
LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data;
const LLPermissions& perm = inv_item->getPermissions();
@@ -3804,7 +3845,12 @@ void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* mode
BOOL inform_server = TRUE;
BOOL deactivate_similar = FALSE;
LLGestureManager::instance().setGestureLoadedCallback(mUUID, boost::bind(&LLGestureBridge::playGesture, mUUID));
- LLGestureManager::instance().activateGestureWithAsset(mUUID, gInventory.getItem(mUUID)->getAssetUUID(), inform_server, deactivate_similar);
+ LLViewerInventoryItem* item = gInventory.getItem(mUUID);
+ llassert(item);
+ if (item)
+ {
+ LLGestureManager::instance().activateGestureWithAsset(mUUID, item->getAssetUUID(), inform_server, deactivate_similar);
+ }
}
else
{
@@ -4047,12 +4093,13 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
gMessageSystem->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID());
gMessageSystem->sendReliable( gAgent.getRegion()->getHost());
- }
- // this object might have been selected, so let the selection manager know it's gone now
- LLViewerObject *found_obj = gObjectList.findObject(item->getLinkedUUID());
- if (found_obj)
- {
- LLSelectMgr::getInstance()->remove(found_obj);
+
+ // this object might have been selected, so let the selection manager know it's gone now
+ LLViewerObject *found_obj = gObjectList.findObject(item->getLinkedUUID());
+ if (found_obj)
+ {
+ LLSelectMgr::getInstance()->remove(found_obj);
+ }
}
}
else LLItemBridge::performAction(folder, model, action);
@@ -4995,6 +5042,65 @@ void LLWearableBridge::removeFromAvatar()
}
}
+
+// +=================================================+
+// | LLMeshBridge |
+// +=================================================+
+
+LLUIImagePtr LLMeshBridge::getIcon() const
+{
+ return get_item_icon(LLAssetType::AT_MESH, LLInventoryType::IT_MESH, 0, FALSE);
+}
+
+void LLMeshBridge::openItem()
+{
+ LLViewerInventoryItem* item = getItem();
+
+ if (item)
+ {
+ // open mesh
+ }
+}
+
+void LLMeshBridge::previewItem()
+{
+ LLViewerInventoryItem* item = getItem();
+ if(item)
+ {
+ // preview mesh
+ }
+}
+
+
+void LLMeshBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+ lldebugs << "LLMeshBridge::buildContextMenu()" << llendl;
+ std::vector<std::string> items;
+ std::vector<std::string> disabled_items;
+
+ if(isItemInTrash())
+ {
+ items.push_back(std::string("Purge Item"));
+ if (!isItemRemovable())
+ {
+ disabled_items.push_back(std::string("Purge Item"));
+ }
+
+ items.push_back(std::string("Restore Item"));
+ }
+ else
+ {
+ items.push_back(std::string("Properties"));
+
+ getClipboardEntries(true, items, disabled_items, flags);
+ }
+
+
+ hide_context_entries(menu, items, disabled_items);
+}
+
+
+
LLInvFVBridgeAction* LLInvFVBridgeAction::createAction(LLAssetType::EType asset_type,
const LLUUID& uuid,LLInventoryModel* model)
{
@@ -5043,6 +5149,12 @@ LLInvFVBridgeAction* LLInvFVBridgeAction::createAction(LLAssetType::EType asset_
break;
+ case LLAssetType::AT_MESH:
+ action = new LLMeshBridgeAction(uuid,model);
+ break;
+
+
+
default:
break;
}
@@ -5285,6 +5397,18 @@ void LLWearableBridgeAction::doIt()
LLInvFVBridgeAction::doIt();
}
+//virtual
+void LLMeshBridgeAction::doIt()
+{
+ LLViewerInventoryItem* item = getItem();
+ if(item)
+ {
+ // do it
+ }
+
+ LLInvFVBridgeAction::doIt();
+}
+
// +=================================================+
// | LLLinkItemBridge |
// +=================================================+
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 32504091cb..318e37f7a1 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -82,6 +82,8 @@ enum EInventoryIcon
LINKITEM_ICON_NAME,
LINKFOLDER_ICON_NAME,
+
+ MESH_ICON_NAME,
ICON_NAME_COUNT
};
@@ -626,7 +628,6 @@ protected:
static std::string sPrefix;
};
-
class LLLinkFolderBridge : public LLItemBridge
{
friend class LLInvFVBridge;
@@ -647,6 +648,25 @@ protected:
static std::string sPrefix;
};
+
+
+class LLMeshBridge : public LLItemBridge
+{
+ friend class LLInvFVBridge;
+public:
+ virtual LLUIImagePtr getIcon() const;
+ virtual void openItem();
+ virtual void previewItem();
+ virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
+
+protected:
+ LLMeshBridge(LLInventoryPanel* inventory, const LLUUID& uuid) :
+ LLItemBridge(inventory, uuid) {}
+};
+
+
+
+
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInvFVBridgeAction (& its derived classes)
//
@@ -807,6 +827,19 @@ protected:
};
+class LLMeshBridgeAction: public LLInvFVBridgeAction
+{
+ friend class LLInvFVBridgeAction;
+public:
+ virtual void doIt() ;
+ virtual ~LLMeshBridgeAction(){}
+protected:
+ LLMeshBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){}
+
+};
+
+
+
void wear_inventory_item_on_avatar(LLInventoryItem* item);
class LLViewerJointAttachment;
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 33623539e9..0c080cc6cb 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -195,6 +195,62 @@ void LLOpenFoldersWithSelection::doFolder(LLFolderViewFolder* folder)
}
}
+static void assign_clothing_bodypart_icon(EInventoryIcon &idx, U32 attachment_point)
+{
+ const EWearableType wearable_type = EWearableType(LLInventoryItem::II_FLAGS_WEARABLES_MASK & attachment_point);
+ switch(wearable_type)
+ {
+ case WT_SHAPE:
+ idx = BODYPART_SHAPE_ICON_NAME;
+ break;
+ case WT_SKIN:
+ idx = BODYPART_SKIN_ICON_NAME;
+ break;
+ case WT_HAIR:
+ idx = BODYPART_HAIR_ICON_NAME;
+ break;
+ case WT_EYES:
+ idx = BODYPART_EYES_ICON_NAME;
+ break;
+ case WT_SHIRT:
+ idx = CLOTHING_SHIRT_ICON_NAME;
+ break;
+ case WT_PANTS:
+ idx = CLOTHING_PANTS_ICON_NAME;
+ break;
+ case WT_SHOES:
+ idx = CLOTHING_SHOES_ICON_NAME;
+ break;
+ case WT_SOCKS:
+ idx = CLOTHING_SOCKS_ICON_NAME;
+ break;
+ case WT_JACKET:
+ idx = CLOTHING_JACKET_ICON_NAME;
+ break;
+ case WT_GLOVES:
+ idx = CLOTHING_GLOVES_ICON_NAME;
+ break;
+ case WT_UNDERSHIRT:
+ idx = CLOTHING_UNDERSHIRT_ICON_NAME;
+ break;
+ case WT_UNDERPANTS:
+ idx = CLOTHING_UNDERPANTS_ICON_NAME;
+ break;
+ case WT_SKIRT:
+ idx = CLOTHING_SKIRT_ICON_NAME;
+ break;
+ case WT_ALPHA:
+ idx = CLOTHING_ALPHA_ICON_NAME;
+ break;
+ case WT_TATTOO:
+ idx = CLOTHING_TATTOO_ICON_NAME;
+ break;
+ default:
+ break;
+ }
+}
+
+
const std::string& get_item_icon_name(LLAssetType::EType asset_type,
LLInventoryType::EType inventory_type,
U32 attachment_point,
@@ -249,62 +305,11 @@ const std::string& get_item_icon_name(LLAssetType::EType asset_type,
break;
case LLAssetType::AT_CLOTHING:
idx = CLOTHING_ICON_NAME;
- case LLAssetType::AT_BODYPART :
- if(LLAssetType::AT_BODYPART == asset_type)
- {
- idx = BODYPART_ICON_NAME;
- }
- switch(LLInventoryItem::II_FLAGS_WEARABLES_MASK & attachment_point)
- {
- case WT_SHAPE:
- idx = BODYPART_SHAPE_ICON_NAME;
- break;
- case WT_SKIN:
- idx = BODYPART_SKIN_ICON_NAME;
- break;
- case WT_HAIR:
- idx = BODYPART_HAIR_ICON_NAME;
- break;
- case WT_EYES:
- idx = BODYPART_EYES_ICON_NAME;
- break;
- case WT_SHIRT:
- idx = CLOTHING_SHIRT_ICON_NAME;
- break;
- case WT_PANTS:
- idx = CLOTHING_PANTS_ICON_NAME;
- break;
- case WT_SHOES:
- idx = CLOTHING_SHOES_ICON_NAME;
- break;
- case WT_SOCKS:
- idx = CLOTHING_SOCKS_ICON_NAME;
- break;
- case WT_JACKET:
- idx = CLOTHING_JACKET_ICON_NAME;
- break;
- case WT_GLOVES:
- idx = CLOTHING_GLOVES_ICON_NAME;
- break;
- case WT_UNDERSHIRT:
- idx = CLOTHING_UNDERSHIRT_ICON_NAME;
- break;
- case WT_UNDERPANTS:
- idx = CLOTHING_UNDERPANTS_ICON_NAME;
- break;
- case WT_SKIRT:
- idx = CLOTHING_SKIRT_ICON_NAME;
- break;
- case WT_ALPHA:
- idx = CLOTHING_ALPHA_ICON_NAME;
- break;
- case WT_TATTOO:
- idx = CLOTHING_TATTOO_ICON_NAME;
- break;
- default:
- // no-op, go with choice above
- break;
- }
+ assign_clothing_bodypart_icon(idx, attachment_point);
+ break;
+ case LLAssetType::AT_BODYPART:
+ idx = BODYPART_ICON_NAME;
+ assign_clothing_bodypart_icon(idx, attachment_point);
break;
case LLAssetType::AT_NOTECARD:
idx = NOTECARD_ICON_NAME;
@@ -321,6 +326,9 @@ const std::string& get_item_icon_name(LLAssetType::EType asset_type,
case LLAssetType::AT_LINK_FOLDER:
idx = LINKFOLDER_ICON_NAME;
break;
+ case LLAssetType::AT_MESH:
+ idx = MESH_ICON_NAME;
+ break;
default:
break;
}
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index a6d63e58f5..ca9b942629 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -143,6 +143,7 @@ BOOL LLInventoryPanel::postBuild()
addChild(mScroller);
mScroller->addChild(mFolders);
mFolders->setScrollContainer(mScroller);
+ mFolders->addChild(mFolders->mStatusTextBox);
}
// Set up the callbacks from the inventory we're viewing, and then build everything.
@@ -522,6 +523,11 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
{
folderp->setHidden(TRUE);
}
+ const LLViewerInventoryCategory *cat = dynamic_cast<LLViewerInventoryCategory *>(objectp);
+ if (cat && getIsHiddenFolderType(cat->getPreferredType()))
+ {
+ folderp->setHidden(TRUE);
+ }
}
}
else
@@ -553,6 +559,12 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
if (itemp)
{
itemp->addToFolder(parent_folder, mFolders);
+
+ // Don't add children of hidden folders unless this is the panel's root folder.
+ if (itemp->getHidden() && (id != mStartFolderID))
+ {
+ return;
+ }
}
}
@@ -954,3 +966,16 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open)
return NULL;
}
+
+void LLInventoryPanel::addHideFolderType(LLFolderType::EType folder_type)
+{
+ if (!getIsHiddenFolderType(folder_type))
+ {
+ mHiddenFolderTypes.push_back(folder_type);
+ }
+}
+
+BOOL LLInventoryPanel::getIsHiddenFolderType(LLFolderType::EType folder_type) const
+{
+ return (std::find(mHiddenFolderTypes.begin(), mHiddenFolderTypes.end(), folder_type) != mHiddenFolderTypes.end());
+}
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index ccff795a51..f312b588b9 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -61,6 +61,9 @@ class LLTabContainer;
class LLInventoryPanel : public LLPanel
{
+ //--------------------------------------------------------------------
+ // Data
+ //--------------------------------------------------------------------
public:
static const std::string DEFAULT_SORT_ORDER;
static const std::string RECENTITEMS_SORT_ORDER;
@@ -97,13 +100,16 @@ public:
{}
};
+ //--------------------------------------------------------------------
+ // Initialization
+ //--------------------------------------------------------------------
protected:
LLInventoryPanel(const Params&);
friend class LLUICtrlFactory;
-
public:
virtual ~LLInventoryPanel();
+public:
LLInventoryModel* getModel() { return mInventory; }
BOOL postBuild();
@@ -187,6 +193,16 @@ protected:
const LLInventoryFVBridgeBuilder* mInvFVBridgeBuilder;
//--------------------------------------------------------------------
+ // Hidden folders
+ //--------------------------------------------------------------------
+public:
+ void addHideFolderType(LLFolderType::EType folder_type);
+protected:
+ BOOL getIsHiddenFolderType(LLFolderType::EType folder_type) const;
+private:
+ std::vector<LLFolderType::EType> mHiddenFolderTypes;
+
+ //--------------------------------------------------------------------
// Initialization routines for building up the UI ("views")
//--------------------------------------------------------------------
public:
diff --git a/indra/newview/lllocaltextureobject.cpp b/indra/newview/lllocaltextureobject.cpp
index 69eb5fce2f..116d9bc446 100644
--- a/indra/newview/lllocaltextureobject.cpp
+++ b/indra/newview/lllocaltextureobject.cpp
@@ -70,6 +70,7 @@ LLLocalTextureObject::LLLocalTextureObject(const LLLocalTextureObject& lto) :
if (!original_layer)
{
llerrs << "could not clone Local Texture Object: unable to extract texlayer!" << llendl;
+ continue;
}
LLTexLayer* new_layer = new LLTexLayer(*original_layer);
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 4f40a0a532..f48c96190f 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -176,7 +176,9 @@ private:
static LLDefaultChildRegistry::Register<LLLocationInputCtrl> r("location_input");
LLLocationInputCtrl::Params::Params()
-: add_landmark_image_enabled("add_landmark_image_enabled"),
+: icon_maturity_general("icon_maturity_general"),
+ icon_maturity_adult("icon_maturity_adult"),
+ add_landmark_image_enabled("add_landmark_image_enabled"),
add_landmark_image_disabled("add_landmark_image_disabled"),
add_landmark_image_hover("add_landmark_image_hover"),
add_landmark_image_selected("add_landmark_image_selected"),
@@ -185,6 +187,7 @@ LLLocationInputCtrl::Params::Params()
add_landmark_button("add_landmark_button"),
for_sale_button("for_sale_button"),
info_button("info_button"),
+ maturity_icon("maturity_icon"),
voice_icon("voice_icon"),
fly_icon("fly_icon"),
push_icon("push_icon"),
@@ -204,7 +207,9 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
mForSaleBtn(NULL),
mInfoBtn(NULL),
mLandmarkImageOn(NULL),
- mLandmarkImageOff(NULL)
+ mLandmarkImageOff(NULL),
+ mIconMaturityGeneral(NULL),
+ mIconMaturityAdult(NULL)
{
// Lets replace default LLLineEditor with LLLocationLineEditor
// to make needed escaping while copying and cutting url
@@ -227,6 +232,7 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
params.commit_on_focus_lost(false);
params.follows.flags(FOLLOWS_ALL);
mTextEntry = LLUICtrlFactory::create<LLURLLineEditor>(params);
+ mTextEntry->setContextMenu(NULL);
addChild(mTextEntry);
// LLLineEditor is replaced with LLLocationLineEditor
@@ -263,7 +269,20 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
mAddLandmarkBtn = LLUICtrlFactory::create<LLButton>(al_params);
enableAddLandmarkButton(true);
addChild(mAddLandmarkBtn);
-
+
+ if (p.icon_maturity_general())
+ {
+ mIconMaturityGeneral = p.icon_maturity_general;
+ }
+ if (p.icon_maturity_adult())
+ {
+ mIconMaturityAdult = p.icon_maturity_adult;
+ }
+
+ LLIconCtrl::Params maturity_icon = p.maturity_icon;
+ mMaturityIcon = LLUICtrlFactory::create<LLIconCtrl>(maturity_icon);
+ addChild(mMaturityIcon);
+
LLButton::Params for_sale_button = p.for_sale_button;
for_sale_button.tool_tip = LLTrans::getString("LocationCtrlForSaleTooltip");
for_sale_button.click_callback.function(
@@ -470,7 +489,10 @@ void LLLocationInputCtrl::onTextEntry(LLLineEditor* line_editor)
*/
void LLLocationInputCtrl::setText(const LLStringExplicit& text)
{
- mTextEntry->setText(text);
+ if (mTextEntry)
+ {
+ mTextEntry->setText(text);
+ }
mHasAutocompletedText = FALSE;
}
@@ -479,7 +501,9 @@ void LLLocationInputCtrl::setFocus(BOOL b)
LLComboBox::setFocus(b);
if (mTextEntry && b && !mList->getVisible())
+ {
mTextEntry->setFocus(TRUE);
+ }
}
void LLLocationInputCtrl::handleLoginComplete()
@@ -521,6 +545,25 @@ void LLLocationInputCtrl::draw()
LLComboBox::draw();
}
+void LLLocationInputCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ LLComboBox::reshape(width, height, called_from_parent);
+
+ // Setting cursor to 0 to show the left edge of the text. See EXT-4967.
+ mTextEntry->setCursor(0);
+ if (mTextEntry->hasSelection())
+ {
+ // Deselecting because selection position is changed together with
+ // cursor position change.
+ mTextEntry->deselect();
+ }
+
+ if (isHumanReadableLocationVisible)
+ {
+ positionMaturityIcon();
+ }
+}
+
void LLLocationInputCtrl::onInfoButtonClicked()
{
LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent"));
@@ -650,8 +693,8 @@ void LLLocationInputCtrl::refreshLocation()
{
// Is one of our children focused?
if (LLUICtrl::hasFocus() || mButton->hasFocus() || mList->hasFocus() ||
- (mTextEntry && mTextEntry->hasFocus()) || (mAddLandmarkBtn->hasFocus()))
-
+ (mTextEntry && mTextEntry->hasFocus()) ||
+ (mAddLandmarkBtn->hasFocus()))
{
llwarns << "Location input should not be refreshed when having focus" << llendl;
return;
@@ -671,6 +714,34 @@ void LLLocationInputCtrl::refreshLocation()
// store human-readable location to compare it in changeLocationPresentation()
mHumanReadableLocation = location_name;
setText(location_name);
+ isHumanReadableLocationVisible = true;
+
+ // Updating maturity rating icon.
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region)
+ return;
+
+ U8 sim_access = region->getSimAccess();
+ switch(sim_access)
+ {
+ case SIM_ACCESS_PG:
+ mMaturityIcon->setValue(mIconMaturityGeneral->getName());
+ mMaturityIcon->setVisible(TRUE);
+ break;
+
+ case SIM_ACCESS_ADULT:
+ mMaturityIcon->setValue(mIconMaturityAdult->getName());
+ mMaturityIcon->setVisible(TRUE);
+ break;
+
+ default:
+ mMaturityIcon->setVisible(FALSE);
+ }
+
+ if (mMaturityIcon->getVisible())
+ {
+ positionMaturityIcon();
+ }
}
// returns new right edge
@@ -691,7 +762,7 @@ void LLLocationInputCtrl::refreshParcelIcons()
{
// Our "cursor" moving right to left
S32 x = mAddLandmarkBtn->getRect().mLeft;
-
+
static LLUICachedControl<bool> show_properties("NavBarShowParcelProperties", false);
if (show_properties)
{
@@ -761,7 +832,7 @@ void LLLocationInputCtrl::refreshParcelIcons()
}
mDamageText->setVisible(false);
}
-
+
S32 left_pad, right_pad;
mTextEntry->getTextPadding(&left_pad, &right_pad);
right_pad = mTextEntry->getRect().mRight - x;
@@ -784,6 +855,25 @@ void LLLocationInputCtrl::refreshHealth()
}
}
+void LLLocationInputCtrl::positionMaturityIcon()
+{
+ const LLFontGL* font = mTextEntry->getFont();
+ if (!font)
+ return;
+
+ S32 left_pad, right_pad;
+ mTextEntry->getTextPadding(&left_pad, &right_pad);
+
+ // Calculate the right edge of rendered text + a whitespace.
+ left_pad = left_pad + font->getWidth(mTextEntry->getText()) + font->getWidth(" ");
+
+ LLRect rect = mMaturityIcon->getRect();
+ mMaturityIcon->setRect(rect.setOriginAndSize(left_pad, rect.mBottom, rect.getWidth(), rect.getHeight()));
+
+ // Hide icon if it text area is not width enough to display it, show otherwise.
+ mMaturityIcon->setVisible(rect.mRight < mTextEntry->getRect().getWidth() - right_pad);
+}
+
void LLLocationInputCtrl::rebuildLocationHistory(std::string filter)
{
LLLocationHistory::location_list_t filtered_items;
@@ -884,16 +974,23 @@ void LLLocationInputCtrl::updateWidgetlayout()
void LLLocationInputCtrl::changeLocationPresentation()
{
- //change location presentation only if user does not select/past anything and
- //human-readable region name is being displayed
+ if (!mTextEntry)
+ return;
+
+ //change location presentation only if user does not select/paste anything and
+ //human-readable region name is being displayed
std::string text = mTextEntry->getText();
LLStringUtil::trim(text);
- if(mTextEntry && !mTextEntry->hasSelection() && text == mHumanReadableLocation )
+ if(!mTextEntry->hasSelection() && text == mHumanReadableLocation)
{
//needs unescaped one
mTextEntry->setText(LLAgentUI::buildSLURL(false));
mTextEntry->selectAll();
- }
+
+ mMaturityIcon->setVisible(FALSE);
+
+ isHumanReadableLocationVisible = false;
+ }
}
void LLLocationInputCtrl::onLocationContextMenuItemClicked(const LLSD& userdata)
diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h
index a830b33f6f..caa62daa1b 100644
--- a/indra/newview/lllocationinputctrl.h
+++ b/indra/newview/lllocationinputctrl.h
@@ -63,7 +63,9 @@ public:
struct Params
: public LLInitParam::Block<Params, LLComboBox::Params>
{
- Optional<LLUIImage*> add_landmark_image_enabled,
+ Optional<LLUIImage*> icon_maturity_general,
+ icon_maturity_adult,
+ add_landmark_image_enabled,
add_landmark_image_disabled,
add_landmark_image_hover,
add_landmark_image_selected;
@@ -72,7 +74,8 @@ public:
Optional<LLButton::Params> add_landmark_button,
for_sale_button,
info_button;
- Optional<LLIconCtrl::Params> voice_icon,
+ Optional<LLIconCtrl::Params> maturity_icon,
+ voice_icon,
fly_icon,
push_icon,
build_icon,
@@ -89,6 +92,7 @@ public:
/*virtual*/ void onFocusReceived();
/*virtual*/ void onFocusLost();
/*virtual*/ void draw();
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
//========================================================================
// LLUICtrl interface
@@ -131,6 +135,7 @@ private:
void refreshParcelIcons();
// Refresh the value in the health percentage text field
void refreshHealth();
+ void positionMaturityIcon();
void rebuildLocationHistory(std::string filter = "");
bool findTeleportItemsByTitle(const LLTeleportHistoryItem& item, const std::string& filter);
@@ -160,7 +165,8 @@ private:
LLButton* mInfoBtn;
S32 mIconHPad; // pad between all icons
S32 mAddLandmarkHPad; // pad to left of landmark star
-
+
+ LLIconCtrl* mMaturityIcon;
LLIconCtrl* mParcelIcon[ICON_COUNT];
LLTextBox* mDamageText;
@@ -172,11 +178,14 @@ private:
boost::signals2::connection mLocationHistoryConnection;
LLUIImage* mLandmarkImageOn;
LLUIImage* mLandmarkImageOff;
+ LLUIImage* mIconMaturityGeneral;
+ LLUIImage* mIconMaturityAdult;
std::string mAddLandmarkTooltip;
std::string mEditLandmarkTooltip;
// this field holds a human-readable form of the location string, it is needed to be able to compare copy-pated value and real location
std::string mHumanReadableLocation;
+ bool isHumanReadableLocationVisible;
};
#endif
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index f9a013b2b1..bf33d8527e 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -982,16 +982,20 @@ void LLMediaCtrl::onClickLinkHref( LLPluginClassMedia* self )
U32 target_type = self->getClickTargetType();
// is there is a target specified for the link?
- if (gSavedSettings.getBOOL("UseExternalBrowser") || target_type == LLPluginClassMedia::TARGET_EXTERNAL)
+ if (target_type == LLPluginClassMedia::TARGET_EXTERNAL ||
+ target_type == LLPluginClassMedia::TARGET_BLANK )
{
- LLSD payload;
- payload["url"] = url;
- payload["target_type"] = LLSD::Integer(target_type);
- LLNotificationsUtil::add( "WebLaunchExternalTarget", LLSD(), payload, onClickLinkExternalTarget);
- }
- else if (target_type == LLPluginClassMedia::TARGET_BLANK)
- {
- clickLinkWithTarget(url, target_type);
+ if (gSavedSettings.getBOOL("UseExternalBrowser"))
+ {
+ LLSD payload;
+ payload["url"] = url;
+ payload["target_type"] = LLSD::Integer(target_type);
+ LLNotificationsUtil::add( "WebLaunchExternalTarget", LLSD(), payload, onClickLinkExternalTarget);
+ }
+ else
+ {
+ clickLinkWithTarget(url, target_type);
+ }
}
else {
const std::string protocol1( "http://" );
@@ -1042,7 +1046,7 @@ bool LLMediaCtrl::onClickLinkExternalTarget(const LLSD& notification, const LLSD
// static
void LLMediaCtrl::clickLinkWithTarget(const std::string& url, const S32& target_type )
{
- if (gSavedSettings.getBOOL("UseExternalBrowser") || target_type == LLPluginClassMedia::TARGET_EXTERNAL)
+ if (target_type == LLPluginClassMedia::TARGET_EXTERNAL)
{
// load target in an external browser
LLWeb::loadURLExternal(url);
diff --git a/indra/newview/llmediadataclient.h b/indra/newview/llmediadataclient.h
index 75d32e707b..8dd72cb595 100755
--- a/indra/newview/llmediadataclient.h
+++ b/indra/newview/llmediadataclient.h
@@ -37,7 +37,7 @@
#include <queue>
#include "llrefcount.h"
#include "llpointer.h"
-#include "lltimer.h"
+#include "lleventtimer.h"
// Link seam for LLVOVolume
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index d579058c32..114fef8712 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -339,8 +339,7 @@ void LLNameListCtrl::refresh(const LLUUID& id, const std::string& first,
LLScrollListItem* item = *iter;
if (item->getUUID() == id)
{
- LLScrollListCell* cell = (LLScrollListCell*)item->getColumn(0);
- cell = item->getColumn(mNameColumnIndex);
+ LLScrollListCell* cell = item->getColumn(mNameColumnIndex);
if (cell)
{
cell->setValue(fullname);
@@ -356,8 +355,9 @@ void LLNameListCtrl::refresh(const LLUUID& id, const std::string& first,
void LLNameListCtrl::refreshAll(const LLUUID& id, const std::string& first,
const std::string& last, BOOL is_group)
{
+ LLInstanceTrackerScopedGuard guard;
LLInstanceTracker<LLNameListCtrl>::instance_iter it;
- for (it = beginInstances(); it != endInstances(); ++it)
+ for (it = guard.beginInstances(); it != guard.endInstances(); ++it)
{
LLNameListCtrl& ctrl = *it;
ctrl.refresh(id, first, last, is_group);
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index be48770567..29e3c66684 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -345,8 +345,10 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
// tmp_chat.mFromName = tmp_chat.mFromID.asString();
}
nearby_chat->addMessage(chat_msg, true, args);
- if(nearby_chat->getVisible())
- return;//no need in toast if chat is visible
+ if( nearby_chat->getVisible()
+ || ( chat_msg.mSourceType == CHAT_SOURCE_AGENT
+ && gSavedSettings.getBOOL("UseChatBubbles") ) )
+ return;//no need in toast if chat is visible or if bubble chat is enabled
// Handle irc styled messages for toast panel
if (tmp_chat.mChatStyle == CHAT_STYLE_IRC)
diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp
index 52de8355e9..60e41b64ac 100644
--- a/indra/newview/llnotificationalerthandler.cpp
+++ b/indra/newview/llnotificationalerthandler.cpp
@@ -36,6 +36,7 @@
#include "llnotificationhandler.h"
#include "llnotifications.h"
+#include "llprogressview.h"
#include "lltoastnotifypanel.h"
#include "llviewercontrol.h"
#include "llviewerwindow.h"
@@ -116,6 +117,11 @@ bool LLAlertHandler::processNotification(const LLSD& notify)
p.is_modal = mIsModal;
p.on_delete_toast = boost::bind(&LLAlertHandler::onDeleteToast, this, _1);
+ // Show alert in middle of progress view (during teleport) (EXT-1093)
+ LLProgressView* progress = gViewerWindow->getProgressView();
+ LLRect rc = progress && progress->getVisible() ? progress->getRect() : gViewerWindow->getWorldViewRectScaled();
+ mChannel->updatePositionAndSize(rc, rc);
+
LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
if(channel)
channel->addToast(p);
diff --git a/indra/newview/lloutputmonitorctrl.cpp b/indra/newview/lloutputmonitorctrl.cpp
index 388fdeea7a..9857e37bc3 100644
--- a/indra/newview/lloutputmonitorctrl.cpp
+++ b/indra/newview/lloutputmonitorctrl.cpp
@@ -249,6 +249,11 @@ void LLOutputMonitorCtrl::draw()
void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id)
{
+ if (speaker_id.isNull() && mSpeakerId.notNull())
+ {
+ LLSpeakingIndicatorManager::unregisterSpeakingIndicator(mSpeakerId, this);
+ }
+
if (speaker_id.isNull() || speaker_id == mSpeakerId) return;
if (mSpeakerId.notNull())
@@ -256,6 +261,7 @@ void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id)
// Unregister previous registration to avoid crash. EXT-4782.
LLSpeakingIndicatorManager::unregisterSpeakingIndicator(mSpeakerId, this);
}
+
mSpeakerId = speaker_id;
LLSpeakingIndicatorManager::registerSpeakingIndicator(mSpeakerId, this);
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index 4a7cdfc856..d7c558d188 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -196,10 +196,9 @@ void LLPanelAvatarNotes::fillRightsData()
childSetValue("map_check",LLRelationship::GRANT_MAP_LOCATION & rights ? TRUE : FALSE);
childSetValue("objects_check",LLRelationship::GRANT_MODIFY_OBJECTS & rights ? TRUE : FALSE);
- childSetEnabled("status_check",TRUE);
- childSetEnabled("map_check",TRUE);
- childSetEnabled("objects_check",TRUE);
}
+
+ enableCheckboxes(NULL != relation);
}
void LLPanelAvatarNotes::onCommitNotes()
@@ -250,6 +249,17 @@ void LLPanelAvatarNotes::confirmModifyRights(bool grant, S32 rights)
void LLPanelAvatarNotes::onCommitRights()
{
+ const LLRelationship* buddy_relationship =
+ LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
+
+ if (NULL == buddy_relationship)
+ {
+ // Lets have a warning log message instead of having a crash. EXT-4947.
+ llwarns << "Trying to modify rights for non-friend avatar. Skipped." << llendl;
+ return;
+ }
+
+
S32 rights = 0;
if(childGetValue("status_check").asBoolean())
@@ -259,8 +269,6 @@ void LLPanelAvatarNotes::onCommitRights()
if(childGetValue("objects_check").asBoolean())
rights |= LLRelationship::GRANT_MODIFY_OBJECTS;
- const LLRelationship* buddy_relationship =
- LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
bool allow_modify_objects = childGetValue("objects_check").asBoolean();
// if modify objects checkbox clicked
@@ -304,9 +312,7 @@ void LLPanelAvatarNotes::resetControls()
//Disable "Add Friend" button for friends.
childSetEnabled("add_friend", TRUE);
- childSetEnabled("status_check",FALSE);
- childSetEnabled("map_check",FALSE);
- childSetEnabled("objects_check",FALSE);
+ enableCheckboxes(false);
}
void LLPanelAvatarNotes::onAddFriendButtonClick()
@@ -334,6 +340,13 @@ void LLPanelAvatarNotes::onShareButtonClick()
//*TODO not implemented.
}
+void LLPanelAvatarNotes::enableCheckboxes(bool enable)
+{
+ childSetEnabled("status_check", enable);
+ childSetEnabled("map_check", enable);
+ childSetEnabled("objects_check", enable);
+}
+
LLPanelAvatarNotes::~LLPanelAvatarNotes()
{
if(getAvatarId().notNull())
@@ -348,6 +361,9 @@ LLPanelAvatarNotes::~LLPanelAvatarNotes()
void LLPanelAvatarNotes::changed(U32 mask)
{
childSetEnabled("teleport", LLAvatarTracker::instance().isBuddyOnline(getAvatarId()));
+
+ // update rights to avoid have checkboxes enabled when friendship is terminated. EXT-4947.
+ fillRightsData();
}
// virtual
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index 632590aa27..52b4255e34 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -259,8 +259,8 @@ private:
};
/**
-* Panel for displaying Avatar's notes and modifying friend's rights.
-*/
+ * Panel for displaying Avatar's notes and modifying friend's rights.
+ */
class LLPanelAvatarNotes
: public LLPanelProfileTab
, public LLFriendObserver
@@ -311,6 +311,7 @@ protected:
void onCallButtonClick();
void onTeleportButtonClick();
void onShareButtonClick();
+ void enableCheckboxes(bool enable);
};
#endif // LL_LLPANELAVATAR_H
diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index 1e46827c1a..8ca044f72b 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -242,7 +242,7 @@ BOOL LLPanelClassified::postBuild()
mNameEditor->setCommitOnFocusLost(TRUE);
mNameEditor->setFocusReceivedCallback(boost::bind(focusReceived, _1, this));
mNameEditor->setCommitCallback(onCommitAny, this);
- mNameEditor->setPrevalidate( LLLineEditor::prevalidateASCII );
+ mNameEditor->setPrevalidate( LLTextValidate::validateASCII );
mDescEditor = getChild<LLTextEditor>("desc_editor");
mDescEditor->setCommitOnFocusLost(TRUE);
@@ -1072,7 +1072,7 @@ BOOL LLFloaterPriceForListing::postBuild()
LLLineEditor* edit = getChild<LLLineEditor>("price_edit");
if (edit)
{
- edit->setPrevalidate(LLLineEditor::prevalidateNonNegativeS32);
+ edit->setPrevalidate(LLTextValidate::validateNonNegativeS32);
std::string min_price = llformat("%d", MINIMUM_PRICE_FOR_LISTING);
edit->setText(min_price);
edit->selectAll();
diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index 469f1c1739..ce4078409a 100644
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -90,6 +90,7 @@ LLPanelGroup::LLPanelGroup()
: LLPanel(),
LLGroupMgrObserver( LLUUID() ),
mSkipRefresh(FALSE),
+ mButtonJoin(NULL),
mShowingNotifyDialog(false)
{
// Set up the factory callbacks.
@@ -159,10 +160,6 @@ BOOL LLPanelGroup::postBuild()
button = getChild<LLButton>("btn_chat");
button->setClickedCallback(onBtnGroupChatClicked, this);
- button = getChild<LLButton>("btn_join");
- button->setVisible(false);
- button->setEnabled(true);
-
button = getChild<LLButton>("btn_cancel");
button->setVisible(false); button->setEnabled(true);
@@ -174,7 +171,7 @@ BOOL LLPanelGroup::postBuild()
childSetCommitCallback("back",boost::bind(&LLPanelGroup::onBackBtnClick,this),NULL);
childSetCommitCallback("btn_create",boost::bind(&LLPanelGroup::onBtnCreate,this),NULL);
- childSetCommitCallback("btn_join",boost::bind(&LLPanelGroup::onBtnJoin,this),NULL);
+
childSetCommitCallback("btn_cancel",boost::bind(&LLPanelGroup::onBtnCancel,this),NULL);
LLPanelGroupTab* panel_general = findChild<LLPanelGroupTab>("group_general_tab_panel");
@@ -188,7 +185,17 @@ BOOL LLPanelGroup::postBuild()
if(panel_land) mTabs.push_back(panel_land);
if(panel_general)
+ {
panel_general->setupCtrls(this);
+ button = panel_general->getChild<LLButton>("btn_join");
+ button->setVisible(false);
+ button->setEnabled(true);
+
+ mButtonJoin = button;
+ mButtonJoin->setCommitCallback(boost::bind(&LLPanelGroup::onBtnJoin,this));
+
+ mJoinText = panel_general->getChild<LLUICtrl>("join_cost_text");
+ }
gVoiceClient->addObserver(this);
@@ -326,16 +333,13 @@ void LLPanelGroup::update(LLGroupChange gc)
{
childSetValue("group_name", gdatap->mName);
childSetToolTip("group_name",gdatap->mName);
-
- LLButton* btn_join = getChild<LLButton>("btn_join");
- LLUICtrl* join_text = getChild<LLUICtrl>("join_cost_text");
-
+
LLGroupData agent_gdatap;
bool is_member = gAgent.getGroupData(mID,agent_gdatap);
bool join_btn_visible = !is_member && gdatap->mOpenEnrollment;
- btn_join->setVisible(join_btn_visible);
- join_text->setVisible(join_btn_visible);
+ mButtonJoin->setVisible(join_btn_visible);
+ mJoinText->setVisible(join_btn_visible);
if(join_btn_visible)
{
@@ -351,7 +355,7 @@ void LLPanelGroup::update(LLGroupChange gc)
{
fee_buff = getString("group_join_free", string_args);
}
- childSetValue("join_cost_text",fee_buff);
+ mJoinText->setValue(fee_buff);
}
}
}
@@ -380,7 +384,7 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
LLButton* button_apply = findChild<LLButton>("btn_apply");
LLButton* button_refresh = findChild<LLButton>("btn_refresh");
LLButton* button_create = findChild<LLButton>("btn_create");
- LLButton* button_join = findChild<LLButton>("btn_join");
+
LLButton* button_cancel = findChild<LLButton>("btn_cancel");
LLButton* button_call = findChild<LLButton>("btn_call");
LLButton* button_chat = findChild<LLButton>("btn_chat");
@@ -417,8 +421,8 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
if(!tab_general || !tab_roles || !tab_notices || !tab_land)
return;
- if(button_join)
- button_join->setVisible(false);
+ if(mButtonJoin)
+ mButtonJoin->setVisible(false);
if(is_null_group_id)//creating new group
@@ -478,6 +482,7 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
}
reposButtons();
+ update(GC_ALL);//show/hide "join" button if data is already ready
}
bool LLPanelGroup::apply(LLPanelGroupTab* tab)
diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h
index 6e23eedffb..136868a60d 100644
--- a/indra/newview/llpanelgroup.h
+++ b/indra/newview/llpanelgroup.h
@@ -130,6 +130,9 @@ protected:
std::vector<LLPanelGroupTab* > mTabs;
+ LLButton* mButtonJoin;
+ LLUICtrl* mJoinText;
+
};
class LLPanelGroupTab : public LLPanel
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index 51fc670d87..555e277ce5 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -206,15 +206,19 @@ BOOL LLPanelGroupGeneral::postBuild()
void LLPanelGroupGeneral::setupCtrls(LLPanel* panel_group)
{
- mInsignia = panel_group->getChild<LLTextureCtrl>("insignia");
+ mInsignia = getChild<LLTextureCtrl>("insignia");
if (mInsignia)
{
mInsignia->setCommitCallback(onCommitAny, this);
mDefaultIconID = mInsignia->getImageAssetID();
}
- mFounderName = panel_group->getChild<LLNameBox>("founder_name");
+ mFounderName = getChild<LLNameBox>("founder_name");
+
+
mGroupNameEditor = panel_group->getChild<LLLineEditor>("group_name_editor");
- mGroupNameEditor->setPrevalidate( LLLineEditor::prevalidateASCII );
+ mGroupNameEditor->setPrevalidate( LLTextValidate::validateASCII );
+
+
}
// static
diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp
index 06a682c905..05261a65de 100644
--- a/indra/newview/llpanelgroupinvite.cpp
+++ b/indra/newview/llpanelgroupinvite.cpp
@@ -36,6 +36,7 @@
#include "llagent.h"
#include "llfloateravatarpicker.h"
#include "llbutton.h"
+#include "llcallingcard.h"
#include "llcombobox.h"
#include "llgroupactions.h"
#include "llgroupmgr.h"
@@ -405,16 +406,13 @@ void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids)
{
LLUUID agent_id = agent_ids[i];
LLViewerObject* dest = gObjectList.findObject(agent_id);
+ std::string fullname;
if(dest && dest->isAvatar())
{
- std::string fullname;
- LLSD args;
LLNameValue* nvfirst = dest->getNVPair("FirstName");
LLNameValue* nvlast = dest->getNVPair("LastName");
if(nvfirst && nvlast)
{
- args["FIRST"] = std::string(nvfirst->getString());
- args["LAST"] = std::string(nvlast->getString());
fullname = std::string(nvfirst->getString()) + " " + std::string(nvlast->getString());
}
if (!fullname.empty())
@@ -427,10 +425,44 @@ void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids)
names.push_back("(Unknown)");
}
}
+ else
+ {
+ //looks like user try to invite offline friend
+ //for offline avatar_id gObjectList.findObject() will return null
+ //so we need to do this additional search in avatar tracker, see EXT-4732
+ if (LLAvatarTracker::instance().isBuddy(agent_id))
+ {
+ if (!gCacheName->getFullName(agent_id, fullname))
+ {
+ // actually it should happen, just in case
+ gCacheName->get(LLUUID(agent_id), false, boost::bind(
+ &LLPanelGroupInvite::addUserCallback, this, _1, _2,
+ _3));
+ // for this special case!
+ //when there is no cached name we should remove resident from agent_ids list to avoid breaking of sequence
+ // removed id will be added in callback
+ agent_ids.erase(agent_ids.begin() + i);
+ }
+ else
+ {
+ names.push_back(fullname);
+ }
+ }
+ }
}
mImplementation->addUsers(names, agent_ids);
}
+void LLPanelGroupInvite::addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name)
+{
+ std::vector<std::string> names;
+ std::vector<LLUUID> agent_ids;
+ std::string full_name = first_name + " " + last_name;
+ agent_ids.push_back(id);
+ names.push_back(first_name + " " + last_name);
+
+ mImplementation->addUsers(names, agent_ids);
+}
void LLPanelGroupInvite::draw()
{
LLPanel::draw();
diff --git a/indra/newview/llpanelgroupinvite.h b/indra/newview/llpanelgroupinvite.h
index 37135b488a..b095dd2395 100644
--- a/indra/newview/llpanelgroupinvite.h
+++ b/indra/newview/llpanelgroupinvite.h
@@ -43,6 +43,10 @@ public:
~LLPanelGroupInvite();
void addUsers(std::vector<LLUUID>& agent_ids);
+ /**
+ * this callback is being used to add a user whose fullname isn't been loaded before invoking of addUsers().
+ */
+ void addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name);
void clear();
void update();
diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp
index 6210973dae..516020797d 100644
--- a/indra/newview/llpanelgroupnotices.cpp
+++ b/indra/newview/llpanelgroupnotices.cpp
@@ -158,6 +158,7 @@ BOOL LLGroupDropTarget::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
case DAD_ANIMATION:
case DAD_GESTURE:
case DAD_CALLINGCARD:
+ case DAD_MESH:
{
LLViewerInventoryItem* inv_item = (LLViewerInventoryItem*)cargo_data;
if(gInventory.getItem(inv_item->getUUID())
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index cbd6f64a48..8e305a5674 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -224,14 +224,6 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
childSetEnabled("share_btn", FALSE);
childSetEnabled("teleport_btn", FALSE);
childSetEnabled("pay_btn", FALSE);
-
- getChild<LLTextBox>("avatar_name")->setValue(im_session->mName);
- getChild<LLTextBox>("avatar_name")->setToolTip(im_session->mName);
- }
- else
- {
- // If the participant is an avatar, fetch the currect name
- gCacheName->get(mAvatarID, FALSE, boost::bind(&LLPanelIMControlPanel::nameUpdatedCallback, this, _1, _2, _3, _4));
}
}
@@ -247,19 +239,6 @@ void LLPanelIMControlPanel::changed(U32 mask)
}
}
-void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group)
-{
- if ( id == mAvatarID )
- {
- std::string avatar_name;
- avatar_name.assign(first);
- avatar_name.append(" ");
- avatar_name.append(last);
- getChild<LLTextBox>("avatar_name")->setValue(avatar_name);
- getChild<LLTextBox>("avatar_name")->setToolTip(avatar_name);
- }
-}
-
LLPanelGroupControlPanel::LLPanelGroupControlPanel(const LLUUID& session_id):
mParticipantList(NULL)
{
diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h
index 3ab505a084..ce8fc58e56 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -89,9 +89,6 @@ public:
// LLFriendObserver trigger
virtual void changed(U32 mask);
-protected:
- void nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group);
-
private:
void onViewProfileButtonClicked();
void onAddFriendButtonClicked();
diff --git a/indra/newview/llpanellandaudio.cpp b/indra/newview/llpanellandaudio.cpp
index 6a4c909759..a92b4357ed 100644
--- a/indra/newview/llpanellandaudio.cpp
+++ b/indra/newview/llpanellandaudio.cpp
@@ -153,6 +153,13 @@ void LLPanelLandAudio::refresh()
mCheckParcelEnableVoice->set(allow_voice);
mCheckParcelVoiceLocal->set(!parcel->getParcelFlagUseEstateVoiceChannel());
+ // don't display urls if you're not able to change it
+ // much requested change in forums so people can't 'steal' urls
+ // NOTE: bug#2009 means this is still vunerable - however, bug
+ // should be closed since this bug opens up major security issues elsewhere.
+ bool obscure_music = ! can_change_media && parcel->getObscureMusic();
+
+ mMusicURLEdit->setDrawAsterixes(obscure_music);
mMusicURLEdit->setText(parcel->getMusicURL());
mMusicURLEdit->setEnabled( can_change_media );
}
diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp
index 36a542cfa0..cd6c727b5c 100644
--- a/indra/newview/llpanellandmarkinfo.cpp
+++ b/indra/newview/llpanellandmarkinfo.cpp
@@ -406,21 +406,24 @@ void LLPanelLandmarkInfo::populateFoldersList()
// Put the "Landmarks" folder first in list.
LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
- const LLViewerInventoryCategory* cat = gInventory.getCategory(landmarks_id);
- if (!cat)
+ const LLViewerInventoryCategory* lmcat = gInventory.getCategory(landmarks_id);
+ if (!lmcat)
{
llwarns << "Cannot find the landmarks folder" << llendl;
}
- std::string cat_full_name = getFullFolderName(cat);
- mFolderCombo->add(cat_full_name, cat->getUUID());
+ else
+ {
+ std::string cat_full_name = getFullFolderName(lmcat);
+ mFolderCombo->add(cat_full_name, lmcat->getUUID());
+ }
typedef std::vector<folder_pair_t> folder_vec_t;
folder_vec_t folders;
// Sort the folders by their full name.
for (S32 i = 0; i < cats.count(); i++)
{
- cat = cats.get(i);
- cat_full_name = getFullFolderName(cat);
+ const LLViewerInventoryCategory* cat = cats.get(i);
+ std::string cat_full_name = getFullFolderName(cat);
folders.push_back(folder_pair_t(cat->getUUID(), cat_full_name));
}
sort(folders.begin(), folders.end(), cmp_folders);
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 7c1b0f6234..40ea75ea7a 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -111,25 +111,76 @@ void LLCheckFolderState::doFolder(LLFolderViewFolder* folder)
}
}
+// Functor searching and opening a folder specified by UUID
+// in a folder view tree.
+class LLOpenFolderByID : public LLFolderViewFunctor
+{
+public:
+ LLOpenFolderByID(const LLUUID& folder_id)
+ : mFolderID(folder_id)
+ , mIsFolderOpen(false)
+ {}
+ virtual ~LLOpenFolderByID() {}
+ /*virtual*/ void doFolder(LLFolderViewFolder* folder);
+ /*virtual*/ void doItem(LLFolderViewItem* item) {}
+
+ bool isFolderOpen() { return mIsFolderOpen; }
+
+private:
+ bool mIsFolderOpen;
+ LLUUID mFolderID;
+};
+
+// virtual
+void LLOpenFolderByID::doFolder(LLFolderViewFolder* folder)
+{
+ if (folder->getListener() && folder->getListener()->getUUID() == mFolderID)
+ {
+ if (!folder->isOpen())
+ {
+ folder->setOpen(TRUE);
+ mIsFolderOpen = true;
+ }
+ }
+}
+
/**
* Bridge to support knowing when the inventory has changed to update Landmarks tab
* ShowFolderState filter setting to show all folders when the filter string is empty and
* empty folder message when Landmarks inventory category has no children.
+ * Ensures that "Landmarks" folder in the Library is open on strart up.
*/
class LLLandmarksPanelObserver : public LLInventoryObserver
{
public:
- LLLandmarksPanelObserver(LLLandmarksPanel* lp) : mLP(lp) {}
+ LLLandmarksPanelObserver(LLLandmarksPanel* lp)
+ : mLP(lp),
+ mIsLibraryLandmarksOpen(false)
+ {}
virtual ~LLLandmarksPanelObserver() {}
/*virtual*/ void changed(U32 mask);
private:
LLLandmarksPanel* mLP;
+ bool mIsLibraryLandmarksOpen;
};
void LLLandmarksPanelObserver::changed(U32 mask)
{
mLP->updateShowFolderState();
+
+ LLPlacesInventoryPanel* library = mLP->getLibraryInventoryPanel();
+ if (!mIsLibraryLandmarksOpen && library)
+ {
+ // Search for "Landmarks" folder in the Library and open it once on start up. See EXT-4827.
+ const LLUUID &landmarks_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false, true);
+ if (landmarks_cat.notNull())
+ {
+ LLOpenFolderByID opener(landmarks_cat);
+ library->getRootFolder()->applyFunctorRecursively(opener);
+ mIsLibraryLandmarksOpen = opener.isFolderOpen();
+ }
+ }
}
LLLandmarksPanel::LLLandmarksPanel()
@@ -526,9 +577,10 @@ void LLLandmarksPanel::initLandmarksPanel(LLPlacesInventoryPanel* inventory_list
{
root_folder->setupMenuHandle(LLInventoryType::IT_CATEGORY, mGearFolderMenu->getHandle());
root_folder->setupMenuHandle(LLInventoryType::IT_LANDMARK, mGearLandmarkMenu->getHandle());
+
+ root_folder->setParentLandmarksPanel(this);
}
- root_folder->setParentLandmarksPanel(this);
inventory_list->saveFolderState();
}
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index cbbd10ac26..6358bd6f23 100644
--- a/indra/newview/llpanellandmarks.h
+++ b/indra/newview/llpanellandmarks.h
@@ -78,6 +78,8 @@ public:
*/
void setItemSelected(const LLUUID& obj_id, BOOL take_keyboard_focus);
+ LLPlacesInventoryPanel* getLibraryInventoryPanel() { return mLibraryInventoryPanel; }
+
protected:
/**
* @return true - if current selected panel is not null and selected item is a landmark
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index df9002facc..43f4024bac 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -213,8 +213,8 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
}
#if !USE_VIEWER_AUTH
- childSetPrevalidate("first_name_edit", LLLineEditor::prevalidateASCIIPrintableNoSpace);
- childSetPrevalidate("last_name_edit", LLLineEditor::prevalidateASCIIPrintableNoSpace);
+ childSetPrevalidate("first_name_edit", LLTextValidate::validateASCIIPrintableNoSpace);
+ childSetPrevalidate("last_name_edit", LLTextValidate::validateASCIIPrintableNoSpace);
childSetCommitCallback("password_edit", mungePassword, this);
getChild<LLLineEditor>("password_edit")->setKeystrokeCallback(onPassKey, this);
@@ -675,8 +675,7 @@ void LLPanelLogin::refreshLocation( bool force_visible )
{
// Don't show on first run after install
// Otherwise ShowStartLocation defaults to true.
- show_start = gSavedSettings.getBOOL("ShowStartLocation")
- && gSavedSettings.getBOOL("HadFirstSuccessfulLogin");
+ show_start = gSavedSettings.getBOOL("ShowStartLocation");
}
sInstance->childSetVisible("start_location_combo", show_start);
@@ -846,8 +845,7 @@ void LLPanelLogin::loadLoginPage()
{
oStr << "&auto_login=TRUE";
}
- if (gSavedSettings.getBOOL("ShowStartLocation")
- && gSavedSettings.getBOOL("HadFirstSuccessfulLogin"))
+ if (gSavedSettings.getBOOL("ShowStartLocation"))
{
oStr << "&show_start_location=TRUE";
}
diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp
index a68552a91e..3504cbd1ef 100644
--- a/indra/newview/llpanelme.cpp
+++ b/indra/newview/llpanelme.cpp
@@ -41,6 +41,7 @@
#include "llsidetray.h"
#include "lltabcontainer.h"
#include "lltexturectrl.h"
+#include "llviewercontrol.h"
#define PICKER_SECOND_LIFE "2nd_life_pic"
#define PICKER_FIRST_LIFE "real_world_pic"
@@ -70,18 +71,16 @@ void LLPanelMe::onOpen(const LLSD& key)
{
LLPanelProfile::onOpen(key);
- if(key.isUndefined() || key.has("edit_my_profile"))
+ // Force Edit My Profile if this is the first time when user is opening Me Panel (EXT-5068)
+ bool opened = gSavedSettings.getBOOL("MePanelOpened");
+ // In some cases Side Tray my call onOpen() twice, check getCollapsed() to be sure this
+ // is the last time onOpen() is called
+ if( !opened && !LLSideTray::getInstance()->getCollapsed() )
{
- // Open Edit My Profile panel by default (through Side Tray -> My Profile) (EXT-4823)
buildEditPanel();
openPanel(mEditPanel, getAvatarId());
- }
- else if(mEditPanel)
- {
- // When opening Me Panel through Side Tray LLPanelMe::onOpen() is called twice.
- // First time key can be undefined and second time - key may contain some data.
- // Lets close Edit Panel if key does contain some data on second call.
- closePanel(mEditPanel);
+
+ gSavedSettings.setBOOL("MePanelOpened", true);
}
}
diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp
index f601a8d51c..64a265219b 100644
--- a/indra/newview/llpanelmediasettingsgeneral.cpp
+++ b/indra/newview/llpanelmediasettingsgeneral.cpp
@@ -206,7 +206,7 @@ void LLPanelMediaSettingsGeneral::clearValues( void* userdata, bool editable)
{
LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;
self->mAutoLoop->clear();
- self->mAutoPlay->clear();
+ self->mAutoPlay->setValue(LLSD(TRUE)); // set default value for auto play to true;
self->mAutoScale->clear();
self->mAutoZoom ->clear();
self->mCurrentURL->clear();
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index e8ae006968..4fc0ec6992 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -816,6 +816,7 @@ BOOL LLTaskCategoryBridge::dragOrDrop(MASK mask, BOOL drop,
case DAD_ANIMATION:
case DAD_GESTURE:
case DAD_CALLINGCARD:
+ case DAD_MESH:
accept = LLToolDragAndDrop::isInventoryDropAcceptable(object, (LLViewerInventoryItem*)cargo_data);
if(accept && drop)
{
@@ -1399,6 +1400,117 @@ LLUIImagePtr LLTaskWearableBridge::getIcon() const
return get_item_icon(mAssetType, LLInventoryType::IT_WEARABLE, mFlags, FALSE );
}
+///----------------------------------------------------------------------------
+/// Class LLTaskMeshBridge
+///----------------------------------------------------------------------------
+
+class LLTaskMeshBridge : public LLTaskInvFVBridge
+{
+public:
+ LLTaskMeshBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name);
+
+ virtual LLUIImagePtr getIcon() const;
+ virtual void openItem();
+ virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);
+ virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
+};
+
+LLTaskMeshBridge::LLTaskMeshBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskMeshBridge::getIcon() const
+{
+ return get_item_icon(LLAssetType::AT_MESH, LLInventoryType::IT_MESH, 0, FALSE);
+}
+
+void LLTaskMeshBridge::openItem()
+{
+ // open mesh
+}
+
+
+// virtual
+void LLTaskMeshBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+{
+ if (action == "mesh action")
+ {
+ LLInventoryItem* item = findItem();
+ if(item)
+ {
+ // do action
+ }
+ }
+ LLTaskInvFVBridge::performAction(folder, model, action);
+}
+
+void LLTaskMeshBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+ LLInventoryItem* item = findItem();
+ if(!item) return;
+ std::vector<std::string> items;
+ std::vector<std::string> disabled_items;
+
+ if(item->getPermissions().getOwner() != gAgent.getID()
+ && item->getSaleInfo().isForSale())
+ {
+ items.push_back(std::string("Task Buy"));
+
+ std::string label= LLTrans::getString("Buy");
+ // Check the price of the item.
+ S32 price = getPrice();
+ if (-1 == price)
+ {
+ llwarns << "label_buy_task_bridged_item: Invalid price" << llendl;
+ }
+ else
+ {
+ std::ostringstream info;
+ info << LLTrans::getString("BuyforL$") << price;
+ label.assign(info.str());
+ }
+
+ const LLView::child_list_t *list = menu.getChildList();
+ LLView::child_list_t::const_iterator itor;
+ for (itor = list->begin(); itor != list->end(); ++itor)
+ {
+ std::string name = (*itor)->getName();
+ LLMenuItemCallGL* menu_itemp = dynamic_cast<LLMenuItemCallGL*>(*itor);
+ if (name == "Task Buy" && menu_itemp)
+ {
+ menu_itemp->setLabel(label);
+ }
+ }
+ }
+ else
+ {
+ items.push_back(std::string("Task Open"));
+ if (!isItemCopyable())
+ {
+ disabled_items.push_back(std::string("Task Open"));
+ }
+ }
+ items.push_back(std::string("Task Properties"));
+ if(isItemRenameable())
+ {
+ items.push_back(std::string("Task Rename"));
+ }
+ if(isItemRemovable())
+ {
+ items.push_back(std::string("Task Remove"));
+ }
+
+
+ hide_context_entries(menu, items, disabled_items);
+}
+
///----------------------------------------------------------------------------
/// LLTaskInvFVBridge impl
@@ -1480,6 +1592,11 @@ LLTaskInvFVBridge* LLTaskInvFVBridge::createObjectBridge(LLPanelObjectInventory*
object->getUUID(),
object->getName());
break;
+ case LLAssetType::AT_MESH:
+ new_bridge = new LLTaskMeshBridge(panel,
+ object->getUUID(),
+ object->getName());
+ break;
break;
default:
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 423ee61e25..36fab86280 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -36,6 +36,7 @@
#include "llfloaterreg.h"
#include "llmenugl.h"
#include "llnotificationsutil.h"
+#include "lleventtimer.h"
#include "llfiltereditor.h"
#include "lltabcontainer.h"
#include "lluictrlfactory.h"
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 8b8b1bed37..01b6e8ffad 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -142,9 +142,9 @@ LLPanelPermissions::LLPanelPermissions() :
BOOL LLPanelPermissions::postBuild()
{
childSetCommitCallback("Object Name",LLPanelPermissions::onCommitName,this);
- childSetPrevalidate("Object Name",LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("Object Name",LLTextValidate::validateASCIIPrintableNoPipe);
childSetCommitCallback("Object Description",LLPanelPermissions::onCommitDesc,this);
- childSetPrevalidate("Object Description",LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("Object Description",LLTextValidate::validateASCIIPrintableNoPipe);
getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLPanelPermissions::onClickGroup,this));
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index ada65c98a4..8eb0b69491 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -843,10 +843,13 @@ void LLPanelPicks::onPanelClassifiedClose(LLPanelClassifiedInfo* panel)
{
LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(
mClassifiedsList->getItemByValue(values[n]));
-
- c_item->setClassifiedName(panel->getClassifiedName());
- c_item->setDescription(panel->getDescription());
- c_item->setSnapshotId(panel->getSnapshotId());
+ llassert(c_item);
+ if (c_item)
+ {
+ c_item->setClassifiedName(panel->getClassifiedName());
+ c_item->setDescription(panel->getDescription());
+ c_item->setSnapshotId(panel->getSnapshotId());
+ }
}
}
}
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index a49386cb5c..26b57c003b 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -1015,7 +1015,8 @@ void LLPanelPlaces::showAddedLandmarkInfo(const std::vector<LLUUID>& items)
LLInventoryItem* item = gInventory.getItem(item_id);
- if (LLAssetType::AT_LANDMARK == item->getType())
+ llassert(item);
+ if (item && (LLAssetType::AT_LANDMARK == item->getType()) )
{
// Created landmark is passed to Places panel to allow its editing.
// If the panel is closed we don't reopen it until created landmark is loaded.
@@ -1023,7 +1024,6 @@ void LLPanelPlaces::showAddedLandmarkInfo(const std::vector<LLUUID>& items)
{
setItem(item);
}
- break;
}
}
}
@@ -1048,14 +1048,13 @@ void LLPanelPlaces::updateVerbs()
mTeleportBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
mShowOnMapBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
- mOverflowBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
+ mOverflowBtn->setVisible(is_place_info_visible && !is_create_landmark_visible && !isLandmarkEditModeOn);
mEditBtn->setVisible(mPlaceInfoType == LANDMARK_INFO_TYPE && !isLandmarkEditModeOn);
mSaveBtn->setVisible(isLandmarkEditModeOn);
mCancelBtn->setVisible(isLandmarkEditModeOn);
mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn);
mShowOnMapBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn && have_3d_pos);
- mOverflowBtn->setEnabled(is_place_info_visible && !is_create_landmark_visible);
if (is_place_info_visible)
{
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 2dc3a62637..479769ee20 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -1036,8 +1036,9 @@ void LLPanelPrimMediaControls::updateZoom()
}
if (zoom_padding > 0.0f)
- {
- LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding);
+ {
+ // since we only zoom into medium for now, always set zoom_in constraint to true
+ LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding, true);
}
// Remember the object ID/face we zoomed into, so we can update the zoom icon appropriately
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index fbe68b4d92..8b01637239 100644
--- a/indra/newview/llpanelvolume.cpp
+++ b/indra/newview/llpanelvolume.cpp
@@ -574,7 +574,7 @@ void LLPanelVolume::onCommitLight( LLUICtrl* ctrl, void* userdata )
LLUUID id = LightTextureCtrl->getImageAssetID();
if (id.notNull())
{
- if (volobjp->getLightTextureID().isNull())
+ if (!volobjp->isLightSpotlight())
{ //this commit is making this a spot light, set UI to default params
volobjp->setLightTextureID(id);
LLVector3 spot_params = volobjp->getSpotLightParams();
@@ -591,7 +591,7 @@ void LLPanelVolume::onCommitLight( LLUICtrl* ctrl, void* userdata )
volobjp->setSpotLightParams(spot_params);
}
}
- else if (volobjp->getLightTextureID().notNull())
+ else if (volobjp->isLightSpotlight())
{ //no longer a spot light
volobjp->setLightTextureID(id);
//self->childDisable("Light FOV");
diff --git a/indra/newview/llplacesinventorypanel.cpp b/indra/newview/llplacesinventorypanel.cpp
index 8edeebaeeb..f1e450a083 100644
--- a/indra/newview/llplacesinventorypanel.cpp
+++ b/indra/newview/llplacesinventorypanel.cpp
@@ -118,6 +118,7 @@ BOOL LLPlacesInventoryPanel::postBuild()
mScroller->addChild(mFolders);
mFolders->setScrollContainer(mScroller);
+ mFolders->addChild(mFolders->mStatusTextBox);
// cut subitems
@@ -174,6 +175,15 @@ S32 LLPlacesInventoryPanel::notify(const LLSD& info)
// PUBLIC METHODS
//////////////////////////////////////////////////////////////////////////
+LLPlacesFolderView::LLPlacesFolderView(const LLFolderView::Params& p)
+: LLFolderView(p)
+{
+ // we do not need auto select functionality in places landmarks, so override default behavior.
+ // this disables applying of the LLSelectFirstFilteredItem in LLFolderView::doIdle.
+ // Fixed issues: EXT-1631, EXT-4994.
+ mAutoSelectOverride = TRUE;
+}
+
BOOL LLPlacesFolderView::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
// let children to change selection first
diff --git a/indra/newview/llplacesinventorypanel.h b/indra/newview/llplacesinventorypanel.h
index 86937e7c7f..04c6758eae 100644
--- a/indra/newview/llplacesinventorypanel.h
+++ b/indra/newview/llplacesinventorypanel.h
@@ -67,7 +67,7 @@ private:
class LLPlacesFolderView : public LLFolderView
{
public:
- LLPlacesFolderView(const LLFolderView::Params& p) : LLFolderView(p) {};
+ LLPlacesFolderView(const LLFolderView::Params& p);
/**
* Handles right mouse down
*
diff --git a/indra/newview/llpreviewanim.cpp b/indra/newview/llpreviewanim.cpp
index 92bd4dc62b..0cc747f789 100644
--- a/indra/newview/llpreviewanim.cpp
+++ b/indra/newview/llpreviewanim.cpp
@@ -79,7 +79,7 @@ BOOL LLPreviewAnim::postBuild()
childSetAction("Anim audition btn",auditionAnim, this);
childSetCommitCallback("desc", LLPreview::onText, this);
- childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
return LLPreview::postBuild();
}
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index 53e351e66e..57a8ca3d12 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -472,7 +472,7 @@ BOOL LLPreviewGesture::postBuild()
edit = getChild<LLLineEditor>("wait_time_editor");
edit->setEnabled(FALSE);
edit->setVisible(FALSE);
- edit->setPrevalidate(LLLineEditor::prevalidateFloat);
+ edit->setPrevalidate(LLTextValidate::validateFloat);
// edit->setKeystrokeCallback(onKeystrokeCommit, this);
edit->setCommitOnFocusLost(TRUE);
edit->setCommitCallback(onCommitWaitTime, this);
@@ -504,10 +504,10 @@ BOOL LLPreviewGesture::postBuild()
if (item)
{
childSetText("desc", item->getDescription());
- childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
childSetText("name", item->getName());
- childSetPrevalidate("name", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("name", &LLTextValidate::validateASCIIPrintableNoPipe);
}
return LLPreview::postBuild();
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index cc70360528..ee8e3f1db6 100644
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -95,7 +95,7 @@ BOOL LLPreviewNotecard::postBuild()
childSetCommitCallback("desc", LLPreview::onText, this);
if (item)
childSetText("desc", item->getDescription());
- childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
return LLPreview::postBuild();
}
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 7bcbe334ff..3221745fa3 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -661,7 +661,9 @@ void LLScriptEdCore::onBtnDynamicHelp()
live_help_floater = new LLFloater(LLSD());
LLUICtrlFactory::getInstance()->buildFloater(live_help_floater, "floater_lsl_guide.xml", NULL);
LLFloater* parent = dynamic_cast<LLFloater*>(getParent());
- parent->addDependentFloater(live_help_floater, TRUE);
+ llassert(parent);
+ if (parent)
+ parent->addDependentFloater(live_help_floater, TRUE);
live_help_floater->childSetCommitCallback("lock_check", onCheckLock, this);
live_help_floater->childSetValue("lock_check", gSavedSettings.getBOOL("ScriptHelpFollowsCursor"));
live_help_floater->childSetCommitCallback("history_combo", onHelpComboCommit, this);
@@ -955,7 +957,7 @@ BOOL LLPreviewLSL::postBuild()
childSetCommitCallback("desc", LLPreview::onText, this);
childSetText("desc", item->getDescription());
- childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
return LLPreview::postBuild();
}
diff --git a/indra/newview/llpreviewsound.cpp b/indra/newview/llpreviewsound.cpp
index d7fd252fb6..44b828854b 100644
--- a/indra/newview/llpreviewsound.cpp
+++ b/indra/newview/llpreviewsound.cpp
@@ -75,7 +75,7 @@ BOOL LLPreviewSound::postBuild()
button->setSoundFlags(LLView::SILENT);
childSetCommitCallback("desc", LLPreview::onText, this);
- childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
return LLPreview::postBuild();
}
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index dfc67d0126..0ed6bea74f 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -126,7 +126,7 @@ BOOL LLPreviewTexture::postBuild()
{
childSetCommitCallback("desc", LLPreview::onText, this);
childSetText("desc", item->getDescription());
- childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
}
}
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
index 0d9cf06bc3..d452ef2228 100644
--- a/indra/newview/llscriptfloater.cpp
+++ b/indra/newview/llscriptfloater.cpp
@@ -38,9 +38,11 @@
#include "llchiclet.h"
#include "llfloaterreg.h"
#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llscreenchannel.h"
#include "llsyswellwindow.h"
#include "lltoastnotifypanel.h"
+#include "lltrans.h"
#include "llviewerwindow.h"
#include "llimfloater.h"
@@ -65,17 +67,14 @@ LLUUID notification_id_to_object_id(const LLUUID& notification_id)
LLScriptFloater::LLScriptFloater(const LLSD& key)
: LLDockableFloater(NULL, true, key)
, mScriptForm(NULL)
+, mSaveFloaterPosition(false)
{
setMouseDownCallback(boost::bind(&LLScriptFloater::onMouseDown, this));
setOverlapsScreenChannel(true);
}
-bool LLScriptFloater::toggle(const LLUUID& object_id)
+bool LLScriptFloater::toggle(const LLUUID& notification_id)
{
- // Force chiclet toggle on here because first onFocusReceived() will not toggle it on.
- LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(object_id, true);
-
- LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id);
LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id);
// show existing floater
@@ -90,50 +89,52 @@ bool LLScriptFloater::toggle(const LLUUID& object_id)
{
floater->setVisible(TRUE);
floater->setFocus(TRUE);
- return true;
}
}
// create and show new floater
else
{
- show(object_id);
- return true;
+ show(notification_id);
}
+
+ LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(notification_id, true);
+ return true;
}
-LLScriptFloater* LLScriptFloater::show(const LLUUID& object_id)
+LLScriptFloater* LLScriptFloater::show(const LLUUID& notification_id)
{
- LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id);
-
- LLScriptFloater* floater = LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id);
- floater->setObjectId(object_id);
- floater->createForm(object_id);
+ LLScriptFloater* floater = LLFloaterReg::getTypedInstance<LLScriptFloater>("script_floater", notification_id);
+ floater->setNotificationId(notification_id);
+ floater->createForm(notification_id);
- if (floater->getDockControl() == NULL)
+ if(LLScriptFloaterManager::OBJ_SCRIPT == LLScriptFloaterManager::getObjectType(notification_id))
{
- LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(object_id);
- if (chiclet == NULL)
- {
- llerror("Dock chiclet for LLScriptFloater doesn't exist", 0);
- }
- else
- {
- LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
- }
-
- floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(),
- LLDockControl::TOP, boost::bind(&LLScriptFloater::getAllowedRect, floater, _1)));
+ floater->setSavePosition(true);
+ floater->restorePosition();
}
+ else
+ {
+ floater->dockToChiclet(true);
+ }
+
+ LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id, TRUE);
return floater;
}
+void LLScriptFloater::setNotificationId(const LLUUID& id)
+{
+ mNotificationId = id;
+ // Lets save object id now while notification exists
+ mObjectId = notification_id_to_object_id(id);
+}
+
void LLScriptFloater::getAllowedRect(LLRect& rect)
{
rect = gViewerWindow->getWorldViewRectRaw();
}
-void LLScriptFloater::createForm(const LLUUID& object_id)
+void LLScriptFloater::createForm(const LLUUID& notification_id)
{
// delete old form
if(mScriptForm)
@@ -142,8 +143,7 @@ void LLScriptFloater::createForm(const LLUUID& object_id)
mScriptForm->die();
}
- LLNotificationPtr notification = LLNotifications::getInstance()->find(
- LLScriptFloaterManager::getInstance()->findNotificationId(object_id));
+ LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
if(NULL == notification)
{
return;
@@ -165,9 +165,11 @@ void LLScriptFloater::createForm(const LLUUID& object_id)
void LLScriptFloater::onClose(bool app_quitting)
{
- if(getObjectId().notNull())
+ savePosition();
+
+ if(getNotificationId().notNull())
{
- LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(getObjectId());
+ LLScriptFloaterManager::getInstance()->onRemoveNotification(getNotificationId());
}
}
@@ -175,6 +177,8 @@ void LLScriptFloater::setDocked(bool docked, bool pop_on_undock /* = true */)
{
LLDockableFloater::setDocked(docked, pop_on_undock);
+ savePosition();
+
hideToastsIfNeeded();
}
@@ -186,7 +190,7 @@ void LLScriptFloater::setVisible(BOOL visible)
if(!visible)
{
- LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getObjectId());
+ LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());
if(chiclet)
{
chiclet->setToggleState(false);
@@ -196,10 +200,10 @@ void LLScriptFloater::setVisible(BOOL visible)
void LLScriptFloater::onMouseDown()
{
- if(getObjectId().notNull())
+ if(getNotificationId().notNull())
{
// Remove new message icon
- LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getObjectId());
+ LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());
if (chiclet == NULL)
{
llerror("Dock chiclet for LLScriptFloater doesn't exist", 0);
@@ -211,17 +215,74 @@ void LLScriptFloater::onMouseDown()
}
}
+void LLScriptFloater::savePosition()
+{
+ if(getSavePosition() && mObjectId.notNull())
+ {
+ LLScriptFloaterManager::FloaterPositionInfo fpi = {getRect(), isDocked()};
+ LLScriptFloaterManager::getInstance()->saveFloaterPosition(mObjectId, fpi);
+ }
+}
+
+void LLScriptFloater::restorePosition()
+{
+ LLScriptFloaterManager::FloaterPositionInfo fpi;
+ if(LLScriptFloaterManager::getInstance()->getFloaterPosition(mObjectId, fpi))
+ {
+ dockToChiclet(fpi.mDockState);
+ if(!fpi.mDockState)
+ {
+ // Un-docked floater is opened in 0,0, now move it to saved position
+ translate(fpi.mRect.mLeft - getRect().mLeft, fpi.mRect.mTop - getRect().mTop);
+ }
+ }
+ else
+ {
+ dockToChiclet(true);
+ }
+}
+
void LLScriptFloater::onFocusLost()
{
- LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getObjectId(), false);
+ if(getNotificationId().notNull())
+ {
+ LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), false);
+ }
}
void LLScriptFloater::onFocusReceived()
{
// first focus will be received before setObjectId() call - don't toggle chiclet
- if(getObjectId().notNull())
+ if(getNotificationId().notNull())
{
- LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getObjectId(), true);
+ LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), true);
+ }
+}
+
+void LLScriptFloater::dockToChiclet(bool dock)
+{
+ if (getDockControl() == NULL)
+ {
+ LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(getNotificationId());
+ if (chiclet == NULL)
+ {
+ llwarns << "Dock chiclet for LLScriptFloater doesn't exist" << llendl;
+ return;
+ }
+ else
+ {
+ LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
+ }
+
+ // Stop saving position while we dock floater
+ bool save = getSavePosition();
+ setSavePosition(false);
+
+ setDockControl(new LLDockControl(chiclet, this, getDockTongue(),
+ LLDockControl::TOP, boost::bind(&LLScriptFloater::getAllowedRect, this, _1)), dock);
+
+ // Restore saving
+ setSavePosition(save);
}
}
@@ -246,200 +307,227 @@ void LLScriptFloater::hideToastsIfNeeded()
void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
{
- // get scripted Object's ID
- LLUUID object_id = notification_id_to_object_id(notification_id);
- if(object_id.isNull())
+ if(notification_id.isNull())
{
- llwarns << "Invalid notification, no object id" << llendl;
+ llwarns << "Invalid notification ID" << llendl;
return;
}
+ // get scripted Object's ID
+ LLUUID object_id = notification_id_to_object_id(notification_id);
+
// Need to indicate of "new message" for object chiclets according to requirements
// specified in the Message Bar design specification. See EXT-3142.
bool set_new_message = false;
+ EObjectType obj_type = getObjectType(notification_id);
- // If an Object spawns more-than-one floater, only the newest one is shown.
- // The previous is automatically closed.
- script_notification_map_t::iterator it = mNotifications.find(object_id);
- if(it != mNotifications.end())
+ // LLDialog can spawn only one instance, LLLoadURL and LLGiveInventory can spawn unlimited number of instances
+ if(OBJ_SCRIPT == obj_type)
{
- LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(object_id);
- if(chiclet)
+ // If an Object spawns more-than-one floater, only the newest one is shown.
+ // The previous is automatically closed.
+ script_notification_map_t::const_iterator it = findUsingObjectId(object_id);
+ if(it != mNotifications.end())
{
- // Pass the new_message icon state further.
- set_new_message = chiclet->getShowNewMessagesIcon();
- }
+ LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(it->first);
+ if(chiclet)
+ {
+ // Pass the new_message icon state further.
+ set_new_message = chiclet->getShowNewMessagesIcon();
+ }
- LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", it->second.notification_id);
- if(floater)
- {
- // Generate chiclet with a "new message" indicator if a docked window was opened but not in focus. See EXT-3142.
- set_new_message |= !floater->hasFocus();
- }
+ LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", it->first);
+ if(floater)
+ {
+ // Generate chiclet with a "new message" indicator if a docked window was opened but not in focus. See EXT-3142.
+ set_new_message |= !floater->hasFocus();
+ }
- onRemoveNotification(it->second.notification_id);
+ onRemoveNotification(it->first);
+ }
}
- LLNotificationData nd = {notification_id};
- mNotifications.insert(std::make_pair(object_id, nd));
+ mNotifications.insert(std::make_pair(notification_id, object_id));
// Create inventory offer chiclet for offer type notifications
- LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
- if( notification && notification->getType() == "offer" )
+ if( OBJ_GIVE_INVENTORY == obj_type )
{
- LLBottomTray::instance().getChicletPanel()->createChiclet<LLInvOfferChiclet>(object_id);
+ LLBottomTray::instance().getChicletPanel()->createChiclet<LLInvOfferChiclet>(notification_id);
}
else
{
- LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(object_id);
+ LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(notification_id);
}
- LLIMWellWindow::getInstance()->addObjectRow(object_id, set_new_message);
+ LLIMWellWindow::getInstance()->addObjectRow(notification_id, set_new_message);
LLSD data;
- data["object_id"] = object_id;
+ data["notification_id"] = notification_id;
data["new_message"] = set_new_message;
data["unread"] = 1; // each object has got only one floater
mNewObjectSignal(data);
- toggleScriptFloater(object_id, set_new_message);
+ toggleScriptFloater(notification_id, set_new_message);
}
void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
{
- LLUUID object_id = findObjectId(notification_id);
- if(object_id.isNull())
+ if(notification_id.isNull())
{
- llwarns << "Invalid notification, no object id" << llendl;
+ llwarns << "Invalid notification ID" << llendl;
return;
}
- using namespace LLNotificationsUI;
-
- // remove related toast
- LLUUID channel_id(gSavedSettings.getString("NotificationChannelUUID"));
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>
- (LLChannelManager::getInstance()->findChannelByID(channel_id));
- LLUUID n_toast_id = findNotificationToastId(object_id);
- if(channel && n_toast_id.notNull())
- {
- channel->killToastByNotificationID(n_toast_id);
- }
-
// remove related chiclet
- LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(object_id);
+ LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(notification_id);
- LLIMWellWindow::getInstance()->removeObjectRow(object_id);
+ LLIMWellWindow::getInstance()->removeObjectRow(notification_id);
// close floater
LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id);
if(floater)
{
- floater->setObjectId(LLUUID::null);
+ floater->savePosition();
+ floater->setNotificationId(LLUUID::null);
floater->closeFloater();
}
- mNotifications.erase(object_id);
+ mNotifications.erase(notification_id);
}
-void LLScriptFloaterManager::removeNotificationByObjectId(const LLUUID& object_id)
+void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& notification_id, bool set_new_message)
{
- // Check we have not removed notification yet
- LLNotificationPtr notification = LLNotifications::getInstance()->find(
- findNotificationId(object_id));
- if(notification)
- {
- onRemoveNotification(notification->getID());
- }
-}
-
-void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& object_id, bool set_new_message)
-{
- // kill toast
- using namespace LLNotificationsUI;
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->findChannelByID(
- LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
- if(channel)
- {
- channel->killToastByNotificationID(findNotificationToastId(object_id));
- }
-
LLSD data;
- data["object_id"] = object_id;
+ data["notification_id"] = notification_id;
data["new_message"] = set_new_message;
mToggleFloaterSignal(data);
// toggle floater
- LLScriptFloater::toggle(object_id);
+ LLScriptFloater::toggle(notification_id);
}
-void LLScriptFloaterManager::setNotificationToastId(const LLUUID& object_id, const LLUUID& notification_id)
+LLUUID LLScriptFloaterManager::findObjectId(const LLUUID& notification_id)
{
- script_notification_map_t::iterator it = mNotifications.find(object_id);
+ script_notification_map_t::const_iterator it = mNotifications.find(notification_id);
if(mNotifications.end() != it)
{
- it->second.toast_notification_id = notification_id;
+ return it->second;
}
+ return LLUUID::null;
}
-LLUUID LLScriptFloaterManager::findObjectId(const LLUUID& notification_id)
+LLUUID LLScriptFloaterManager::findNotificationId(const LLUUID& object_id)
{
- if(notification_id.notNull())
+ if(object_id.notNull())
{
- script_notification_map_t::const_iterator it = mNotifications.begin();
- for(; mNotifications.end() != it; ++it)
+ script_notification_map_t::const_iterator it = findUsingObjectId(object_id);
+ if(mNotifications.end() != it)
{
- if(notification_id == it->second.notification_id)
- {
- return it->first;
- }
+ return it->first;
}
}
return LLUUID::null;
}
-LLUUID LLScriptFloaterManager::findNotificationId(const LLUUID& object_id)
+// static
+LLScriptFloaterManager::EObjectType LLScriptFloaterManager::getObjectType(const LLUUID& notification_id)
{
- script_notification_map_t::const_iterator it = mNotifications.find(object_id);
- if(mNotifications.end() != it)
+ if(notification_id.isNull())
{
- return it->second.notification_id;
+ llwarns << "Invalid notification ID" << llendl;
+ return OBJ_UNKNOWN;
}
- return LLUUID::null;
-}
-LLUUID LLScriptFloaterManager::findNotificationToastId(const LLUUID& object_id)
-{
- script_notification_map_t::const_iterator it = mNotifications.find(object_id);
- if(mNotifications.end() != it)
+ static const object_type_map TYPE_MAP = initObjectTypeMap();
+
+ LLNotificationPtr notification = LLNotificationsUtil::find(notification_id);
+ object_type_map::const_iterator it = TYPE_MAP.find(notification->getName());
+ if(it != TYPE_MAP.end())
{
- return it->second.toast_notification_id;
+ return it->second;
}
- return LLUUID::null;
+
+ llwarns << "Unknown object type" << llendl;
+ return OBJ_UNKNOWN;
}
-//static
-void LLScriptFloaterManager::onToastButtonClick(const LLSD&notification, const LLSD&response)
+// static
+std::string LLScriptFloaterManager::getObjectName(const LLUUID& notification_id)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
- LLUUID object_id = notification["payload"]["object_id"].asUUID();
+ using namespace LLNotificationsUI;
+ LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
+ if(!notification)
+ {
+ llwarns << "Invalid notification" << llendl;
+ return LLStringUtil::null;
+ }
+
+ std::string text;
- switch(option)
+ switch(LLScriptFloaterManager::getObjectType(notification_id))
{
- case 0: // "Open"
- LLScriptFloaterManager::getInstance()->toggleScriptFloater(object_id);
+ case LLScriptFloaterManager::OBJ_SCRIPT:
+ text = notification->getSubstitutions()["TITLE"].asString();
break;
- case 1: // "Ignore"
- LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(object_id);
+ case LLScriptFloaterManager::OBJ_LOAD_URL:
+ text = notification->getSubstitutions()["OBJECTNAME"].asString();
break;
- case 2: // "Block"
- LLMuteList::getInstance()->add(LLMute(object_id, notification["substitutions"]["TITLE"], LLMute::OBJECT));
- LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(object_id);
+ case LLScriptFloaterManager::OBJ_GIVE_INVENTORY:
+ text = notification->getSubstitutions()["NAME"].asString();
break;
default:
- llwarns << "Unexpected value" << llendl;
+ text = LLTrans::getString("object");
break;
}
+
+ return text;
+}
+
+//static
+LLScriptFloaterManager::object_type_map LLScriptFloaterManager::initObjectTypeMap()
+{
+ object_type_map type_map;
+ type_map["ScriptDialog"] = OBJ_SCRIPT;
+ type_map["ScriptDialogGroup"] = OBJ_SCRIPT;
+ type_map["LoadWebPage"] = OBJ_LOAD_URL;
+ type_map["ObjectGiveItem"] = OBJ_GIVE_INVENTORY;
+ return type_map;
+}
+
+LLScriptFloaterManager::script_notification_map_t::const_iterator LLScriptFloaterManager::findUsingObjectId(const LLUUID& object_id)
+{
+ script_notification_map_t::const_iterator it = mNotifications.begin();
+ for(; mNotifications.end() != it; ++it)
+ {
+ if(object_id == it->second)
+ {
+ return it;
+ }
+ }
+ return mNotifications.end();
+}
+
+void LLScriptFloaterManager::saveFloaterPosition(const LLUUID& object_id, const FloaterPositionInfo& fpi)
+{
+ if(object_id.notNull())
+ {
+ LLScriptFloaterManager::getInstance()->mFloaterPositions[object_id] = fpi;
+ }
+ else
+ {
+ llwarns << "Invalid object id" << llendl;
+ }
+}
+
+bool LLScriptFloaterManager::getFloaterPosition(const LLUUID& object_id, FloaterPositionInfo& fpi)
+{
+ floater_position_map_t::const_iterator it = mFloaterPositions.find(object_id);
+ if(LLScriptFloaterManager::getInstance()->mFloaterPositions.end() != it)
+ {
+ fpi = it->second;
+ return true;
+ }
+ return false;
}
// EOF
diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h
index f86605c5d1..ec3ec4b540 100644
--- a/indra/newview/llscriptfloater.h
+++ b/indra/newview/llscriptfloater.h
@@ -48,6 +48,15 @@ class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager>
// know how script notifications should look like.
public:
+ typedef enum e_object_type
+ {
+ OBJ_SCRIPT,
+ OBJ_GIVE_INVENTORY,
+ OBJ_LOAD_URL,
+
+ OBJ_UNKNOWN
+ }EObjectType;
+
/**
* Handles new notifications.
* Saves notification and object ids, removes old notification if needed, creates script chiclet
@@ -62,11 +71,6 @@ public:
void onRemoveNotification(const LLUUID& notification_id);
/**
- * Wrapper for onRemoveNotification, removes notification by object id.
- */
- void removeNotificationByObjectId(const LLUUID& object_id);
-
- /**
* Toggles script floater.
* Removes "new message" icon from chiclet and removes notification toast.
*/
@@ -76,38 +80,47 @@ public:
LLUUID findNotificationId(const LLUUID& object_id);
- LLUUID findNotificationToastId(const LLUUID& object_id);
-
- /**
- * Associate notification toast id with object id.
- */
- void setNotificationToastId(const LLUUID& object_id, const LLUUID& notification_id);
+ static EObjectType getObjectType(const LLUUID& notification_id);
- /**
- * Callback for notification toast buttons.
- */
- static void onToastButtonClick(const LLSD&notification, const LLSD&response);
+ static std::string getObjectName(const LLUUID& notification_id);
typedef boost::signals2::signal<void(const LLSD&)> object_signal_t;
boost::signals2::connection addNewObjectCallback(const object_signal_t::slot_type& cb) { return mNewObjectSignal.connect(cb); }
boost::signals2::connection addToggleObjectFloaterCallback(const object_signal_t::slot_type& cb) { return mToggleFloaterSignal.connect(cb); }
-private:
-
- struct LLNotificationData
+ struct FloaterPositionInfo
{
- LLUUID notification_id;
- LLUUID toast_notification_id;
+ LLRect mRect;
+ bool mDockState;
};
- // <object_id, notification_data>
- typedef std::map<LLUUID, LLNotificationData> script_notification_map_t;
+ void saveFloaterPosition(const LLUUID& object_id, const FloaterPositionInfo& fpi);
+
+ bool getFloaterPosition(const LLUUID& object_id, FloaterPositionInfo& fpi);
+
+protected:
+
+ typedef std::map<std::string, EObjectType> object_type_map;
+
+ static object_type_map initObjectTypeMap();
+
+ // <notification_id, object_id>
+ typedef std::map<LLUUID, LLUUID> script_notification_map_t;
+
+ script_notification_map_t::const_iterator findUsingObjectId(const LLUUID& object_id);
+
+private:
script_notification_map_t mNotifications;
object_signal_t mNewObjectSignal;
object_signal_t mToggleFloaterSignal;
+
+ // <object_id, floater position>
+ typedef std::map<LLUUID, FloaterPositionInfo> floater_position_map_t;
+
+ floater_position_map_t mFloaterPositions;
};
/**
@@ -136,9 +149,9 @@ public:
*/
static LLScriptFloater* show(const LLUUID& object_id);
- const LLUUID& getObjectId() { return mObjectId; }
+ const LLUUID& getNotificationId() { return mNotificationId; }
- void setObjectId(const LLUUID& id) { mObjectId = id; }
+ void setNotificationId(const LLUUID& id);
/**
* Close notification if script floater is closed.
@@ -155,6 +168,14 @@ public:
*/
/*virtual*/ void setVisible(BOOL visible);
+ bool getSavePosition() { return mSaveFloaterPosition; }
+
+ void setSavePosition(bool save) { mSaveFloaterPosition = save; }
+
+ void savePosition();
+
+ void restorePosition();
+
protected:
/**
@@ -178,9 +199,13 @@ protected:
/*virtual*/ void onFocusReceived();
+ void dockToChiclet(bool dock);
+
private:
LLToastNotifyPanel* mScriptForm;
+ LLUUID mNotificationId;
LLUUID mObjectId;
+ bool mSaveFloaterPosition;
};
#endif //LL_SCRIPTFLOATER_H
diff --git a/indra/newview/llsearchcombobox.cpp b/indra/newview/llsearchcombobox.cpp
index 93a70b6471..a130878176 100644
--- a/indra/newview/llsearchcombobox.cpp
+++ b/indra/newview/llsearchcombobox.cpp
@@ -78,6 +78,7 @@ LLSearchComboBox::LLSearchComboBox(const Params&p)
button_params.click_callback.function(boost::bind(&LLSearchComboBox::onSelectionCommit, this));
mSearchButton = LLUICtrlFactory::create<LLButton>(button_params);
mTextEntry->addChild(mSearchButton);
+ mTextEntry->setPassDelete(TRUE);
setButtonVisible(p.dropdown_button_visible);
mTextEntry->setCommitCallback(boost::bind(&LLComboBox::onTextCommit, this, _2));
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 9540894646..f45abca246 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -69,6 +69,7 @@
#include "llhudmanager.h"
#include "llinventorymodel.h"
#include "llmenugl.h"
+#include "llmeshrepository.h"
#include "llmutelist.h"
#include "llsidepaneltaskinfo.h"
#include "llslurl.h"
@@ -180,7 +181,6 @@ LLObjectSelection *get_null_object_selection()
// Build time optimization, generate this function once here
template class LLSelectMgr* LLSingleton<class LLSelectMgr>::getInstance();
-
//-----------------------------------------------------------------------------
// LLSelectMgr()
//-----------------------------------------------------------------------------
@@ -4919,13 +4919,15 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
// set up transform to encompass bounding box of HUD
glMatrixMode(GL_PROJECTION);
- glPushMatrix();
+ gGL.pushMatrix();
glLoadIdentity();
F32 depth = llmax(1.f, hud_bbox.getExtentLocal().mV[VX] * 1.1f);
glOrtho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, depth);
glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.pushMatrix();
+ gGL.pushUIMatrix();
+ gGL.loadUIIdentity();
glLoadIdentity();
glLoadMatrixf(OGL_TO_CFR_ROTATION); // Load Cory's favorite reference frame
glTranslatef(-hud_bbox.getCenterLocal().mV[VX] + (depth *0.5f), 0.f, 0.f);
@@ -5022,10 +5024,11 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
if (for_hud && avatar)
{
glMatrixMode(GL_PROJECTION);
- glPopMatrix();
+ gGL.popMatrix();
glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ gGL.popMatrix();
+ gGL.popUIMatrix();
stop_glerror();
}
@@ -5344,6 +5347,78 @@ BOOL LLSelectNode::allowOperationOnNode(PermissionBit op, U64 group_proxy_power)
return (mPermissions->allowOperationBy(op, proxy_agent_id, group_id));
}
+void LLSelectNode::renderOneWireframe(const LLColor4& color)
+{
+ LLViewerObject* objectp = getObject();
+ if (!objectp)
+ {
+ return;
+ }
+
+ LLDrawable* drawable = objectp->mDrawable;
+ if(!drawable)
+ {
+ return;
+ }
+
+ glMatrixMode(GL_MODELVIEW);
+ gGL.pushMatrix();
+
+ BOOL is_hud_object = objectp->isHUDAttachment();
+
+ if (!is_hud_object)
+ {
+ glLoadIdentity();
+ glMultMatrixd(gGLModelView);
+ }
+
+ if (drawable->isActive())
+ {
+ glMultMatrixf((F32*) objectp->getRenderMatrix().mMatrix);
+ }
+
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+ if (LLSelectMgr::sRenderHiddenSelections) // && gFloaterTools && gFloaterTools->getVisible())
+ {
+ gGL.blendFunc(LLRender::BF_SOURCE_COLOR, LLRender::BF_ONE);
+ LLGLEnable fog(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_LINEAR);
+ float d = (LLViewerCamera::getInstance()->getPointOfInterest()-LLViewerCamera::getInstance()->getOrigin()).magVec();
+ LLColor4 fogCol = color * (F32)llclamp((LLSelectMgr::getInstance()->getSelectionCenterGlobal()-gAgent.getCameraPositionGlobal()).magVec()/(LLSelectMgr::getInstance()->getBBoxOfSelection().getExtentLocal().magVec()*4), 0.0, 1.0);
+ glFogf(GL_FOG_START, d);
+ glFogf(GL_FOG_END, d*(1 + (LLViewerCamera::getInstance()->getView() / LLViewerCamera::getInstance()->getDefaultFOV())));
+ glFogfv(GL_FOG_COLOR, fogCol.mV);
+
+ LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_GEQUAL);
+ gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
+ {
+ glColor4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f);
+ for (S32 i = 0; i < drawable->getNumFaces(); ++i)
+ {
+ LLFace* face = drawable->getFace(i);
+ pushVerts(face, LLVertexBuffer::MAP_VERTEX);
+ }
+ }
+ }
+
+ gGL.flush();
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+
+ glColor4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2);
+ LLGLEnable offset(GL_POLYGON_OFFSET_LINE);
+ glPolygonOffset(3.f, 2.f);
+ glLineWidth(3.f);
+ for (S32 i = 0; i < drawable->getNumFaces(); ++i)
+ {
+ LLFace* face = drawable->getFace(i);
+ pushVerts(face, LLVertexBuffer::MAP_VERTEX);
+ }
+ glLineWidth(1.f);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ gGL.popMatrix();
+}
+
//-----------------------------------------------------------------------------
// renderOneSilhouette()
//-----------------------------------------------------------------------------
@@ -5361,6 +5436,13 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
return;
}
+ LLVOVolume* vobj = drawable->getVOVolume();
+ if (vobj && vobj->isMesh())
+ {
+ renderOneWireframe(color);
+ return;
+ }
+
if (!mSilhouetteExists)
{
return;
@@ -5374,7 +5456,10 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
}
glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.pushMatrix();
+ gGL.pushUIMatrix();
+ gGL.loadUIIdentity();
+
if (!is_hud_object)
{
glLoadIdentity();
@@ -5493,7 +5578,8 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
gGL.end();
gGL.flush();
}
- glPopMatrix();
+ gGL.popMatrix();
+ gGL.popUIMatrix();
}
//
@@ -6047,10 +6133,32 @@ BOOL LLObjectSelection::isEmpty() const
//-----------------------------------------------------------------------------
// getObjectCount() - returns number of non null objects
//-----------------------------------------------------------------------------
-S32 LLObjectSelection::getObjectCount()
+S32 LLObjectSelection::getObjectCount(BOOL mesh_adjust)
{
cleanupNodes();
S32 count = mList.size();
+
+ if (mesh_adjust)
+ {
+ for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter)
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+
+ if (object && object->getVolume())
+ {
+ LLVOVolume* vobj = (LLVOVolume*) object;
+ if (vobj->isMesh())
+ {
+ LLUUID mesh_id = vobj->getVolume()->getParams().getSculptID();
+ U32 cost = gMeshRepo.getResourceCost(mesh_id);
+ count += cost-1;
+ }
+ }
+
+ }
+ }
+
return count;
}
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 00474827ca..60b151f1c6 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -140,6 +140,7 @@ public:
BOOL isTESelected(S32 te_index);
S32 getLastSelectedTE();
S32 getTESelectMask() { return mTESelectMask; }
+ void renderOneWireframe(const LLColor4& color);
void renderOneSilhouette(const LLColor4 &color);
void setTransient(BOOL transient) { mTransient = transient; }
BOOL isTransient() { return mTransient; }
@@ -290,7 +291,7 @@ public:
LLSelectNode* findNode(LLViewerObject* objectp);
// count members
- S32 getObjectCount();
+ S32 getObjectCount(BOOL mesh_adjust = FALSE);
S32 getTECount();
S32 getRootObjectCount();
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 43215f86bd..cd4a821774 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -278,7 +278,7 @@ void LLSidepanelAppearance::toggleLookInfoPanel(BOOL visible)
return;
mLookInfo->setVisible(visible);
- mPanelOutfitsInventory->setVisible(!visible);
+ if (mPanelOutfitsInventory) mPanelOutfitsInventory->setVisible(!visible);
mFilterEditor->setVisible(!visible);
mEditBtn->setVisible(!visible);
mNewOutfitBtn->setVisible(!visible);
@@ -305,7 +305,7 @@ void LLSidepanelAppearance::updateVerbs()
{
bool is_look_info_visible = mLookInfo->getVisible();
- if (!is_look_info_visible)
+ if (mPanelOutfitsInventory && !is_look_info_visible)
{
const bool is_correct_type = (mPanelOutfitsInventory->getCorrectListenerForAction() != NULL);
mEditBtn->setEnabled(is_correct_type);
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index 3fd5309947..73880563d7 100644
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -62,7 +62,7 @@ BOOL LLSidepanelInventory::postBuild()
// UI elements from inventory panel
{
mInventoryPanel = getChild<LLPanel>("sidepanel__inventory_panel");
-
+
mInfoBtn = mInventoryPanel->getChild<LLButton>("info_btn");
mInfoBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onInfoButtonClicked, this));
@@ -83,6 +83,14 @@ BOOL LLSidepanelInventory::postBuild()
mPanelMainInventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2));
+
+ /*
+ EXT-4846 : "Can we suppress the "Landmarks" and "My Favorites" folder since they have their own Task Panel?"
+ Deferring this until 2.1.
+ LLInventoryPanel *my_inventory_panel = mPanelMainInventory->getChild<LLInventoryPanel>("All Items");
+ my_inventory_panel->addHideFolderType(LLFolderType::FT_LANDMARK);
+ my_inventory_panel->addHideFolderType(LLFolderType::FT_FAVORITE);
+ */
}
// UI elements from item panel
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index 94fe95d215..0275736f6d 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -109,9 +109,9 @@ BOOL LLSidepanelItemInfo::postBuild()
{
LLSidepanelInventorySubpanel::postBuild();
- childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("LabelItemName",&LLTextValidate::validateASCIIPrintableNoPipe);
getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this));
- childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("LabelItemDesc",&LLTextValidate::validateASCIIPrintableNoPipe);
getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this));
// Creator information
getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickCreator,this));
@@ -231,20 +231,23 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
// PERMISSIONS LOOKUP //
////////////////////////
+ llassert(item);
+ if (!item) return;
+
// do not enable the UI for incomplete items.
BOOL is_complete = item->isComplete();
const BOOL cannot_restrict_permissions = LLInventoryType::cannotRestrictPermissions(item->getInventoryType());
const BOOL is_calling_card = (item->getInventoryType() == LLInventoryType::IT_CALLINGCARD);
const LLPermissions& perm = item->getPermissions();
const BOOL can_agent_manipulate = gAgent.allowOperation(PERM_OWNER, perm,
- GP_OBJECT_MANIPULATE);
+ GP_OBJECT_MANIPULATE);
const BOOL can_agent_sell = gAgent.allowOperation(PERM_OWNER, perm,
- GP_OBJECT_SET_SALE) &&
+ GP_OBJECT_SET_SALE) &&
!cannot_restrict_permissions;
const BOOL is_link = item->getIsLinkType();
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- bool not_in_trash = item && (item->getUUID() != trash_id) && !gInventory.isObjectDescendentOf(item->getUUID(), trash_id);
+ bool not_in_trash = (item->getUUID() != trash_id) && !gInventory.isObjectDescendentOf(item->getUUID(), trash_id);
// You need permission to modify the object to modify an inventory
// item in it.
diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp
index 0b8f66c5f3..0630981d7e 100644
--- a/indra/newview/llsidepaneltaskinfo.cpp
+++ b/indra/newview/llsidepaneltaskinfo.cpp
@@ -104,9 +104,9 @@ BOOL LLSidepanelTaskInfo::postBuild()
mLabelGroupName = getChild<LLNameBox>("Group Name Proxy");
childSetCommitCallback("Object Name", LLSidepanelTaskInfo::onCommitName,this);
- childSetPrevalidate("Object Name", LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("Object Name", LLTextValidate::validateASCIIPrintableNoPipe);
childSetCommitCallback("Object Description", LLSidepanelTaskInfo::onCommitDesc,this);
- childSetPrevalidate("Object Description", LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("Object Description", LLTextValidate::validateASCIIPrintableNoPipe);
getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLSidepanelTaskInfo::onClickGroup,this));
childSetCommitCallback("checkbox share with group", &LLSidepanelTaskInfo::onCommitGroupShare,this);
childSetAction("button deed", &LLSidepanelTaskInfo::onClickDeedToGroup,this);
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index b1c8675793..140a9c818a 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -139,6 +139,8 @@ public:
LLPanel* getButtonsPanel() { return mButtonsPanel; }
+ bool getCollapsed() { return mCollapsed; }
+
public:
virtual ~LLSideTray(){};
diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp
index 3343ee88bd..e4773f99c5 100644
--- a/indra/newview/llslurl.cpp
+++ b/indra/newview/llslurl.cpp
@@ -40,6 +40,12 @@ const std::string LLSLURL::PREFIX_SL_HELP = "secondlife://app.";
const std::string LLSLURL::PREFIX_SL = "sl://";
const std::string LLSLURL::PREFIX_SECONDLIFE = "secondlife://";
const std::string LLSLURL::PREFIX_SLURL_OLD = "http://slurl.com/secondlife/";
+
+// For DnD - even though www.slurl.com redirects to slurl.com in a browser, you can copy and drag
+// text with www.slurl.com or a link explicitly pointing at www.slurl.com so testing for this
+// version is required also.
+const std::string LLSLURL::PREFIX_SLURL_WWW = "http://www.slurl.com/secondlife/";
+
const std::string LLSLURL::PREFIX_SLURL = "http://maps.secondlife.com/secondlife/";
const std::string LLSLURL::APP_TOKEN = "app/";
@@ -68,7 +74,10 @@ std::string LLSLURL::stripProtocol(const std::string& url)
{
stripped.erase(0, PREFIX_SLURL_OLD.length());
}
-
+ else if (matchPrefix(stripped, PREFIX_SLURL_WWW))
+ {
+ stripped.erase(0, PREFIX_SLURL_WWW.length());
+ }
return stripped;
}
@@ -81,6 +90,7 @@ bool LLSLURL::isSLURL(const std::string& url)
if (matchPrefix(url, PREFIX_SECONDLIFE)) return true;
if (matchPrefix(url, PREFIX_SLURL)) return true;
if (matchPrefix(url, PREFIX_SLURL_OLD)) return true;
+ if (matchPrefix(url, PREFIX_SLURL_WWW)) return true;
return false;
}
@@ -91,6 +101,7 @@ bool LLSLURL::isSLURLCommand(const std::string& url)
if (matchPrefix(url, PREFIX_SL + APP_TOKEN) ||
matchPrefix(url, PREFIX_SECONDLIFE + "/" + APP_TOKEN) ||
matchPrefix(url, PREFIX_SLURL + APP_TOKEN) ||
+ matchPrefix(url, PREFIX_SLURL_WWW + APP_TOKEN) ||
matchPrefix(url, PREFIX_SLURL_OLD + APP_TOKEN) )
{
return true;
diff --git a/indra/newview/llslurl.h b/indra/newview/llslurl.h
index 21b32ce409..6a695e84f3 100644
--- a/indra/newview/llslurl.h
+++ b/indra/newview/llslurl.h
@@ -51,6 +51,7 @@ public:
static const std::string PREFIX_SECONDLIFE;
static const std::string PREFIX_SLURL;
static const std::string PREFIX_SLURL_OLD;
+ static const std::string PREFIX_SLURL_WWW;
static const std::string APP_TOKEN;
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 2a57d48f16..19bf40b56a 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -2294,7 +2294,6 @@ void pushVerts(LLFace* face, U32 mask)
U16 offset = face->getIndicesStart();
buffer->drawRange(LLRender::TRIANGLES, start, end, count, offset);
}
-
}
void pushBufferVerts(LLVertexBuffer* buffer, U32 mask)
@@ -3380,7 +3379,8 @@ LLDrawInfo::LLDrawInfo(U16 start, U16 end, U32 count, U32 offset,
mVSize(0.f),
mGroup(NULL),
mFace(NULL),
- mDistance(0.f)
+ mDistance(0.f),
+ mDrawMode(LLRender::TRIANGLES)
{
mDebugColor = (rand() << 16) + rand();
if (mStart >= mVertexBuffer->getRequestedVerts() ||
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index 64c2a9acbc..c5719bebcc 100644
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -59,6 +59,7 @@ class LLTextureAtlasSlot;
S32 AABBSphereIntersect(const LLVector3& min, const LLVector3& max, const LLVector3 &origin, const F32 &rad);
S32 AABBSphereIntersectR2(const LLVector3& min, const LLVector3& max, const LLVector3 &origin, const F32 &radius_squared);
+void pushVerts(LLFace* face, U32 mask);
// get index buffer for binary encoded axis vertex buffer given a box at center being viewed by given camera
U8* get_box_fan_indices(LLCamera* camera, const LLVector3& center);
@@ -93,6 +94,7 @@ public:
LLFace* mFace; //associated face
F32 mDistance;
LLVector3 mExtents[2];
+ U32 mDrawMode;
struct CompareTexture
{
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index 786fa24e65..717a8bda1e 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -175,6 +175,11 @@ BOOL LLSpeakerActionTimer::tick()
return TRUE;
}
+void LLSpeakerActionTimer::unset()
+{
+ mActionCallback = 0;
+}
+
LLSpeakersDelayActionsStorage::LLSpeakersDelayActionsStorage(LLSpeakerActionTimer::action_callback_t action_cb, F32 action_delay)
: mActionCallback(action_cb)
, mActionDelay(action_delay)
@@ -205,7 +210,7 @@ void LLSpeakersDelayActionsStorage::setActionTimer(const LLUUID& speaker_id)
}
}
-void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id, bool delete_it)
+void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id)
{
if (mActionTimersMap.size() == 0) return;
@@ -213,10 +218,7 @@ void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id, b
if (it_speaker != mActionTimersMap.end())
{
- if (delete_it)
- {
- delete it_speaker->second;
- }
+ it_speaker->second->unset();
mActionTimersMap.erase(it_speaker);
}
}
@@ -233,8 +235,7 @@ void LLSpeakersDelayActionsStorage::removeAllTimers()
bool LLSpeakersDelayActionsStorage::onTimerActionCallback(const LLUUID& speaker_id)
{
- bool delete_it = false; // we're *in* this timer, return true to delete it, don't manually delete it
- unsetActionTimer(speaker_id, delete_it);
+ unsetActionTimer(speaker_id);
if (mActionCallback)
{
@@ -293,9 +294,7 @@ LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::strin
}
}
- bool delete_it = true;
- mSpeakerDelayRemover->unsetActionTimer(speakerp->mID, delete_it);
-
+ mSpeakerDelayRemover->unsetActionTimer(speakerp->mID);
return speakerp;
}
diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h
index ddc3632f07..b924fb2f2c 100644
--- a/indra/newview/llspeakers.h
+++ b/indra/newview/llspeakers.h
@@ -34,6 +34,7 @@
#define LL_LLSPEAKERS_H
#include "llevent.h"
+#include "lleventtimer.h"
#include "llspeakers.h"
#include "llvoicechannel.h"
@@ -155,6 +156,13 @@ public:
*/
virtual BOOL tick();
+ /**
+ * Clears the callback.
+ *
+ * Use this instead of deleteing this object.
+ * The next call to tick() will return true and that will destroy this object.
+ */
+ void unset();
private:
action_callback_t mActionCallback;
LLUUID mSpeakerId;
@@ -180,7 +188,7 @@ public:
*
* @see onTimerActionCallback()
*/
- void unsetActionTimer(const LLUUID& speaker_id, bool delete_it);
+ void unsetActionTimer(const LLUUID& speaker_id);
void removeAllTimers();
private:
@@ -188,7 +196,6 @@ private:
* Callback of the each instance of LLSpeakerActionTimer.
*
* Unsets an appropriate timer instance and calls action callback for specified speacker_id.
- * It always returns false to not use LLEventTimer::updateClass functionality of timer deleting.
*
* @see unsetActionTimer()
*/
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index a402dfc3d1..136989166f 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -123,7 +123,7 @@
#include "llmutelist.h"
#include "llpanelavatar.h"
#include "llavatarpropertiesprocessor.h"
-#include "llpanelevent.h"
+#include "llfloaterevent.h"
#include "llpanelclassified.h"
#include "llpanelpick.h"
#include "llpanelplace.h"
@@ -135,13 +135,14 @@
#include "llsecondlifeurls.h"
#include "llselectmgr.h"
#include "llsky.h"
+#include "llsidetray.h"
#include "llstatview.h"
-#include "lltrans.h"
#include "llstatusbar.h" // sendMoneyBalanceRequest(), owns L$ balance
#include "llsurface.h"
#include "lltexturecache.h"
#include "lltexturefetch.h"
#include "lltoolmgr.h"
+#include "lltrans.h"
#include "llui.h"
#include "llurldispatcher.h"
#include "llurlsimstring.h"
@@ -773,6 +774,8 @@ bool idle_startup()
LLPanelLogin::giveFocus();
+ gSavedSettings.setBOOL("FirstRunThisInstall", FALSE);
+
LLStartUp::setStartupState( STATE_LOGIN_WAIT ); // Wait for user input
}
else
@@ -798,6 +801,9 @@ bool idle_startup()
gLoginMenuBarView->setVisible( TRUE );
gLoginMenuBarView->setEnabled( TRUE );
+ // Hide the splash screen
+ LLSplashScreen::hide();
+
// Push our window frontmost
gViewerWindow->getWindow()->show();
display_startup();
@@ -1196,6 +1202,7 @@ bool idle_startup()
display_startup();
LLStartUp::setStartupState( STATE_MULTIMEDIA_INIT );
+
return FALSE;
}
@@ -1698,6 +1705,13 @@ bool idle_startup()
<< " kbps" << LL_ENDL;
gViewerThrottle.setMaxBandwidth(FAST_RATE_BPS / 1024.f);
}
+
+ // Set the show start location to true, now that the user has logged
+ // on with this install.
+ gSavedSettings.setBOOL("ShowStartLocation", TRUE);
+
+ LLSideTray::getInstance()->showPanel("panel_home", LLSD());
+
}
// We're successfully logged in.
@@ -1877,17 +1891,6 @@ bool idle_startup()
}
}
- // If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account)
- // then auto-populate outfits from the library into the My Outfits folder.
- static bool check_populate_my_outfits = true;
- if (check_populate_my_outfits &&
- (LLInventoryModel::getIsFirstTimeInViewer2()
- || gSavedSettings.getBOOL("MyOutfitsAutofill")))
- {
- gAgentWearables.populateMyOutfitsFolder();
- }
- check_populate_my_outfits = false;
-
return TRUE;
}
@@ -2006,9 +2009,6 @@ bool idle_startup()
LLStartUp::setStartupState( STATE_STARTED );
- // Mark that we have successfully logged in at least once
- gSavedSettings.setBOOL("HadFirstSuccessfulLogin", TRUE);
-
// Unmute audio if desired and setup volumes.
// Unmute audio if desired and setup volumes.
// This is a not-uncommon crash site, so surround it with
@@ -2473,7 +2473,7 @@ void register_viewer_callbacks(LLMessageSystem* msg)
msg->setHandlerFunc("MapBlockReply", LLWorldMapMessage::processMapBlockReply);
msg->setHandlerFunc("MapItemReply", LLWorldMapMessage::processMapItemReply);
- msg->setHandlerFunc("EventInfoReply", LLPanelEvent::processEventInfoReply);
+ msg->setHandlerFunc("EventInfoReply", LLFloaterEvent::processEventInfoReply);
msg->setHandlerFunc("PickInfoReply", &LLAvatarPropertiesProcessor::processPickInfoReply);
// msg->setHandlerFunc("ClassifiedInfoReply", LLPanelClassified::processClassifiedInfoReply);
msg->setHandlerFunc("ClassifiedInfoReply", LLAvatarPropertiesProcessor::processClassifiedInfoReply);
@@ -2533,6 +2533,8 @@ bool callback_choose_gender(const LLSD& notification, const LLSD& response)
void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
const std::string& gender_name )
{
+ llinfos << "starting" << llendl;
+
// Not going through the processAgentInitialWearables path, so need to set this here.
LLAppearanceManager::instance().setAttachmentInvLinkEnable(true);
// Initiate creation of COF, since we're also bypassing that.
@@ -2553,27 +2555,53 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
// try to find the outfit - if not there, create some default
// wearables.
- LLInventoryModel::cat_array_t cat_array;
- LLInventoryModel::item_array_t item_array;
- LLNameCategoryCollector has_name(outfit_folder_name);
- gInventory.collectDescendentsIf(gInventory.getLibraryRootFolderID(),
- cat_array,
- item_array,
- LLInventoryModel::EXCLUDE_TRASH,
- has_name);
- if (0 == cat_array.count())
+ LLUUID cat_id = findDescendentCategoryIDByName(
+ gInventory.getLibraryRootFolderID(),
+ outfit_folder_name);
+ if (cat_id.isNull())
{
gAgentWearables.createStandardWearables(gender);
}
else
{
- LLInventoryCategory* cat = cat_array.get(0);
bool do_copy = true;
bool do_append = false;
+ LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
LLAppearanceManager::instance().wearInventoryCategory(cat, do_copy, do_append);
}
- LLAppearanceManager::instance().wearOutfitByName(gestures);
- LLAppearanceManager::instance().wearOutfitByName(COMMON_GESTURES_FOLDER);
+
+ // Copy gestures
+ LLUUID dst_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);
+ LLPointer<LLInventoryCallback> cb(NULL);
+ LLAppearanceManager *app_mgr = &(LLAppearanceManager::instance());
+
+ // - Copy gender-specific gestures.
+ LLUUID gestures_cat_id = findDescendentCategoryIDByName(
+ gInventory.getLibraryRootFolderID(),
+ gestures);
+ if (gestures_cat_id.notNull())
+ {
+ callAfterCategoryFetch(gestures_cat_id,
+ boost::bind(&LLAppearanceManager::shallowCopyCategory,
+ app_mgr,
+ gestures_cat_id,
+ dst_id,
+ cb));
+ }
+
+ // - Copy common gestures.
+ LLUUID common_gestures_cat_id = findDescendentCategoryIDByName(
+ gInventory.getLibraryRootFolderID(),
+ COMMON_GESTURES_FOLDER);
+ if (common_gestures_cat_id.notNull())
+ {
+ callAfterCategoryFetch(common_gestures_cat_id,
+ boost::bind(&LLAppearanceManager::shallowCopyCategory,
+ app_mgr,
+ common_gestures_cat_id,
+ dst_id,
+ cb));
+ }
// This is really misnamed -- it means we have started loading
// an outfit/shape that will give the avatar a gender eventually. JC
diff --git a/indra/newview/llstylemap.cpp b/indra/newview/llstylemap.cpp
index 2485563cbc..61705c4eb3 100644
--- a/indra/newview/llstylemap.cpp
+++ b/indra/newview/llstylemap.cpp
@@ -49,6 +49,7 @@ const LLStyle::Params &LLStyleMap::lookupAgent(const LLUUID &source)
if (source != LLUUID::null && source != gAgent.getID() )
{
style_params.color.control = "HTMLLinkColor";
+ style_params.readonly_color.control = "HTMLLinkColor";
style_params.link_href =
LLSLURL::buildCommand("agent", source, "inspect");
}
@@ -56,6 +57,7 @@ const LLStyle::Params &LLStyleMap::lookupAgent(const LLUUID &source)
{
// Make the resident's own name white and don't make the name clickable.
style_params.color = LLColor4::white;
+ style_params.readonly_color = LLColor4::white;
}
mMap[source] = style_params;
@@ -75,11 +77,13 @@ const LLStyle::Params &LLStyleMap::lookup(const LLUUID& id, const std::string& l
if (id != LLUUID::null && !link.empty())
{
style_params.color.control = "HTMLLinkColor";
+ style_params.readonly_color.control = "HTMLLinkColor";
style_params.link_href = link;
}
else
{
style_params.color = LLColor4::white;
+ style_params.readonly_color = LLColor4::white;
}
mMap[id] = style_params;
}
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index ba15053381..127b4265ca 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -404,7 +404,10 @@ BOOL LLIMWellWindow::RowPanel::handleMouseDown(S32 x, S32 y, MASK mask)
{
// Pass the mouse down event to the chiclet (EXT-596).
if (!mChiclet->pointInView(x, y) && !mCloseBtn->getRect().pointInRect(x, y)) // prevent double call of LLIMChiclet::onMouseDown()
+ {
mChiclet->onMouseDown();
+ return TRUE;
+ }
return LLPanel::handleMouseDown(x, y, mask);
}
@@ -418,16 +421,16 @@ BOOL LLIMWellWindow::RowPanel::handleRightMouseDown(S32 x, S32 y, MASK mask)
/* ObjectRowPanel implementation */
/************************************************************************/
-LLIMWellWindow::ObjectRowPanel::ObjectRowPanel(const LLUUID& object_id, bool new_message/* = false*/)
+LLIMWellWindow::ObjectRowPanel::ObjectRowPanel(const LLUUID& notification_id, bool new_message/* = false*/)
: LLPanel()
, mChiclet(NULL)
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_active_object_row.xml", NULL);
- initChiclet(object_id);
+ initChiclet(notification_id);
LLTextBox* obj_name = getChild<LLTextBox>("object_name");
- obj_name->setValue(getObjectName(object_id));
+ obj_name->setValue(LLScriptFloaterManager::getObjectName(notification_id));
mCloseBtn = getChild<LLButton>("hide_btn");
mCloseBtn->setCommitCallback(boost::bind(&LLIMWellWindow::ObjectRowPanel::onClosePanel, this));
@@ -438,90 +441,18 @@ LLIMWellWindow::ObjectRowPanel::~ObjectRowPanel()
{
}
-std::string LLIMWellWindow::ObjectRowPanel::getObjectName(const LLUUID& object_id)
-{
- using namespace LLNotificationsUI;
- LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id);
- LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
- if(!notification)
- {
- llwarns << "Invalid notification" << llendl;
- return LLStringUtil::null;
- }
-
- std::string text;
-
- switch(getObjectType(notification))
- {
- case OBJ_SCRIPT:
- text = notification->getSubstitutions()["TITLE"].asString();
- break;
- case OBJ_LOAD_URL:
- text = notification->getSubstitutions()["OBJECTNAME"].asString();
- break;
- case OBJ_GIVE_INVENTORY:
- text = notification->getSubstitutions()["NAME"].asString();
- break;
- default:
- text = getString("unknown_obj");
- break;
- }
-
- return text;
-}
-
//---------------------------------------------------------------------------------
void LLIMWellWindow::ObjectRowPanel::onClosePanel()
{
- LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(mChiclet->getSessionId());
-}
-
-//static
-LLIMWellWindow::ObjectRowPanel::object_type_map LLIMWellWindow::ObjectRowPanel::initObjectTypeMap()
-{
- object_type_map type_map;
- type_map["ScriptDialog"] = OBJ_SCRIPT;
- type_map["LoadWebPage"] = OBJ_LOAD_URL;
- type_map["ObjectGiveItem"] = OBJ_GIVE_INVENTORY;
- return type_map;
-}
-
-// static
-LLIMWellWindow::ObjectRowPanel::EObjectType LLIMWellWindow::ObjectRowPanel::getObjectType(const LLNotificationPtr& notification)
-{
- if(!notification)
- {
- llwarns << "Invalid notification" << llendl;
- return OBJ_UNKNOWN;
- }
-
- static object_type_map type_map = initObjectTypeMap();
- std::string name = notification->getName();
- object_type_map::const_iterator it = type_map.find(name);
- if(it != type_map.end())
- {
- return it->second;
- }
-
- llwarns << "Unknown object type" << llendl;
- return OBJ_UNKNOWN;
+ LLScriptFloaterManager::getInstance()->onRemoveNotification(mChiclet->getSessionId());
}
-void LLIMWellWindow::ObjectRowPanel::initChiclet(const LLUUID& object_id, bool new_message/* = false*/)
+void LLIMWellWindow::ObjectRowPanel::initChiclet(const LLUUID& notification_id, bool new_message/* = false*/)
{
- using namespace LLNotificationsUI;
- LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id);
- LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
- if(!notification)
- {
- llwarns << "Invalid notification" << llendl;
- return;
- }
-
// Choose which of the pre-created chiclets to use.
- switch(getObjectType(notification))
+ switch(LLScriptFloaterManager::getObjectType(notification_id))
{
- case OBJ_GIVE_INVENTORY:
+ case LLScriptFloaterManager::OBJ_GIVE_INVENTORY:
mChiclet = getChild<LLInvOfferChiclet>("inv_offer_chiclet");
break;
default:
@@ -530,8 +461,7 @@ void LLIMWellWindow::ObjectRowPanel::initChiclet(const LLUUID& object_id, bool n
}
mChiclet->setVisible(true);
- mChiclet->setSessionId(object_id);
-// mChiclet->setShowNewMessagesIcon(new_message);
+ mChiclet->setSessionId(notification_id);
}
//---------------------------------------------------------------------------------
@@ -552,7 +482,10 @@ BOOL LLIMWellWindow::ObjectRowPanel::handleMouseDown(S32 x, S32 y, MASK mask)
{
// Pass the mouse down event to the chiclet (EXT-596).
if (!mChiclet->pointInView(x, y) && !mCloseBtn->getRect().pointInRect(x, y)) // prevent double call of LLIMChiclet::onMouseDown()
+ {
mChiclet->onMouseDown();
+ return TRUE;
+ }
return LLPanel::handleMouseDown(x, y, mask);
}
@@ -780,10 +713,10 @@ void LLIMWellWindow::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID
}
}
-LLChiclet* LLIMWellWindow::findObjectChiclet(const LLUUID& object_id)
+LLChiclet* LLIMWellWindow::findObjectChiclet(const LLUUID& notification_id)
{
LLChiclet* res = NULL;
- ObjectRowPanel* panel = mMessageList->getTypedItemByValue<ObjectRowPanel>(object_id);
+ ObjectRowPanel* panel = mMessageList->getTypedItemByValue<ObjectRowPanel>(notification_id);
if (panel != NULL)
{
res = panel->mChiclet;
@@ -861,33 +794,33 @@ void LLIMWellWindow::delIMRow(const LLUUID& sessionId)
}
}
-void LLIMWellWindow::addObjectRow(const LLUUID& object_id, bool new_message/* = false*/)
+void LLIMWellWindow::addObjectRow(const LLUUID& notification_id, bool new_message/* = false*/)
{
- if (mMessageList->getItemByValue(object_id) == NULL)
+ if (mMessageList->getItemByValue(notification_id) == NULL)
{
- ObjectRowPanel* item = new ObjectRowPanel(object_id, new_message);
- if (mMessageList->insertItemAfter(mSeparator, item, object_id))
+ ObjectRowPanel* item = new ObjectRowPanel(notification_id, new_message);
+ if (mMessageList->insertItemAfter(mSeparator, item, notification_id))
{
handleItemAdded(IT_INSTANT_MESSAGE);
}
else
{
- llwarns << "Unable to add Object Row into the list, objectID: " << object_id << llendl;
+ llwarns << "Unable to add Object Row into the list, notificationID: " << notification_id << llendl;
item->die();
}
reshapeWindow();
}
}
-void LLIMWellWindow::removeObjectRow(const LLUUID& object_id)
+void LLIMWellWindow::removeObjectRow(const LLUUID& notification_id)
{
- if (mMessageList->removeItemByValue(object_id))
+ if (mMessageList->removeItemByValue(notification_id))
{
handleItemRemoved(IT_INSTANT_MESSAGE);
}
else
{
- llwarns << "Unable to remove Object Row from the list, objectID: " << object_id << llendl;
+ llwarns << "Unable to remove Object Row from the list, notificationID: " << notification_id << llendl;
}
reshapeWindow();
@@ -967,8 +900,7 @@ void LLIMWellWindow::closeAllImpl()
ObjectRowPanel* obj_panel = dynamic_cast <ObjectRowPanel*> (panel);
if (obj_panel)
{
- LLScriptFloaterManager::instance()
- .removeNotificationByObjectId(*iter);
+ LLScriptFloaterManager::instance().onRemoveNotification(*iter);
}
}
}
diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h
index 0c81d1f369..3790aa3ea9 100644
--- a/indra/newview/llsyswellwindow.h
+++ b/indra/newview/llsyswellwindow.h
@@ -188,8 +188,8 @@ public:
/*virtual*/ void sessionRemoved(const LLUUID& session_id);
/*virtual*/ void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
- void addObjectRow(const LLUUID& object_id, bool new_message = false);
- void removeObjectRow(const LLUUID& object_id);
+ void addObjectRow(const LLUUID& notification_id, bool new_message = false);
+ void removeObjectRow(const LLUUID& notification_id);
void addIMRow(const LLUUID& session_id);
bool hasIMRow(const LLUUID& session_id);
@@ -201,7 +201,7 @@ protected:
private:
LLChiclet * findIMChiclet(const LLUUID& sessionId);
- LLChiclet* findObjectChiclet(const LLUUID& object_id);
+ LLChiclet* findObjectChiclet(const LLUUID& notification_id);
void addIMRow(const LLUUID& sessionId, S32 chicletCounter, const std::string& name, const LLUUID& otherParticipantId);
void delIMRow(const LLUUID& sessionId);
@@ -235,17 +235,8 @@ private:
class ObjectRowPanel: public LLPanel
{
- typedef enum e_object_type
- {
- OBJ_UNKNOWN,
-
- OBJ_SCRIPT,
- OBJ_GIVE_INVENTORY,
- OBJ_LOAD_URL
- }EObjectType;
-
public:
- ObjectRowPanel(const LLUUID& object_id, bool new_message = false);
+ ObjectRowPanel(const LLUUID& notification_id, bool new_message = false);
virtual ~ObjectRowPanel();
/*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);
/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
@@ -254,12 +245,8 @@ private:
private:
void onClosePanel();
- static EObjectType getObjectType(const LLNotificationPtr& notification);
- void initChiclet(const LLUUID& object_id, bool new_message = false);
- std::string getObjectName(const LLUUID& object_id);
+ void initChiclet(const LLUUID& notification_id, bool new_message = false);
- typedef std::map<std::string, EObjectType> object_type_map;
- static object_type_map initObjectTypeMap();
public:
LLIMChiclet* mChiclet;
private:
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index a7f26f1df1..91c303c79e 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -51,7 +51,8 @@
// cache/textures/[0-F]/UUID.texture
// Actual texture body files
-const S32 TEXTURE_CACHE_ENTRY_SIZE = 1024;
+//note: there is no good to define 1024 for TEXTURE_CACHE_ENTRY_SIZE while FIRST_PACKET_SIZE is 600 on sim side.
+const S32 TEXTURE_CACHE_ENTRY_SIZE = FIRST_PACKET_SIZE;//1024;
const F32 TEXTURE_CACHE_PURGE_AMOUNT = .20f; // % amount to reduce the cache by when it exceeds its limit
const F32 TEXTURE_CACHE_LRU_SIZE = .10f; // % amount for LRU list (low overhead to regenerate)
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 2b846d33fc..60ac701b15 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -291,7 +291,7 @@ BOOL LLFloaterTexturePicker::handleDragAndDrop(
{
BOOL handled = FALSE;
- if (cargo_type == DAD_TEXTURE)
+ if ((cargo_type == DAD_TEXTURE) || (cargo_type == DAD_MESH))
{
LLInventoryItem *item = (LLInventoryItem *)cargo_data;
@@ -1162,7 +1162,9 @@ BOOL LLTextureCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask,
// returns true, then the cast was valid, and we can perform
// the third test without problems.
LLInventoryItem* item = (LLInventoryItem*)cargo_data;
- if (getEnabled() && (cargo_type == DAD_TEXTURE) && allowDrop(item))
+ if (getEnabled() &&
+ ((cargo_type == DAD_TEXTURE) || (cargo_type == DAD_MESH)) &&
+ allowDrop(item))
{
if (drop)
{
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 404b79bfaf..6c35464a51 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -73,13 +73,11 @@ private:
}
virtual void completed(bool success)
{
- mFetcher->lockQueue();
LLTextureFetchWorker* worker = mFetcher->getWorker(mID);
if (worker)
{
worker->callbackCacheRead(success, mFormattedImage, mImageSize, mImageLocal);
}
- mFetcher->unlockQueue();
}
private:
LLTextureFetch* mFetcher;
@@ -95,13 +93,11 @@ private:
}
virtual void completed(bool success)
{
- mFetcher->lockQueue();
LLTextureFetchWorker* worker = mFetcher->getWorker(mID);
if (worker)
{
worker->callbackCacheWrite(success);
}
- mFetcher->unlockQueue();
}
private:
LLTextureFetch* mFetcher;
@@ -117,13 +113,11 @@ private:
}
virtual void completed(bool success, LLImageRaw* raw, LLImageRaw* aux)
{
- mFetcher->lockQueue();
LLTextureFetchWorker* worker = mFetcher->getWorker(mID);
if (worker)
{
worker->callbackDecoded(success, raw, aux);
}
- mFetcher->unlockQueue();
}
private:
LLTextureFetch* mFetcher;
@@ -166,6 +160,8 @@ public:
void setGetStatus(U32 status, const std::string& reason)
{
+ LLMutexLock lock(&mWorkMutex);
+
mGetStatus = status;
mGetReason = reason;
}
@@ -307,7 +303,6 @@ public:
}
lldebugs << "HTTP COMPLETE: " << mID << llendl;
- mFetcher->lockQueue();
LLTextureFetchWorker* worker = mFetcher->getWorker(mID);
if (worker)
{
@@ -339,7 +334,6 @@ public:
mFetcher->removeFromHTTPQueue(mID);
llwarns << "Worker not found: " << mID << llendl;
}
- mFetcher->unlockQueue();
}
private:
@@ -494,8 +488,9 @@ void LLTextureFetchWorker::setupPacketData()
U32 LLTextureFetchWorker::calcWorkPriority()
{
-// llassert_always(mImagePriority >= 0 && mImagePriority <= LLViewerTexture::maxDecodePriority());
- static F32 PRIORITY_SCALE = (F32)LLWorkerThread::PRIORITY_LOWBITS / LLViewerFetchedTexture::maxDecodePriority();
+ //llassert_always(mImagePriority >= 0 && mImagePriority <= LLViewerFetchedTexture::maxDecodePriority());
+ static const F32 PRIORITY_SCALE = (F32)LLWorkerThread::PRIORITY_LOWBITS / LLViewerFetchedTexture::maxDecodePriority();
+
mWorkPriority = (U32)(mImagePriority * PRIORITY_SCALE);
return mWorkPriority;
}
@@ -987,7 +982,12 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
if (mLoadedDiscard < 0)
{
- llerrs << "Decode entered with invalid mLoadedDiscard. ID = " << mID << llendl;
+ //llerrs << "Decode entered with invalid mLoadedDiscard. ID = " << mID << llendl;
+
+ //abort, don't decode
+ mState = DONE;
+ setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
+ return true;
}
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it
mRawImage = NULL;
@@ -1440,12 +1440,9 @@ bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, con
return false;
}
- LLTextureFetchWorker* worker = NULL;
- LLMutexLock lock(&mQueueMutex);
- map_t::iterator iter = mRequestMap.find(id);
- if (iter != mRequestMap.end())
+ LLTextureFetchWorker* worker = getWorker(id) ;
+ if (worker)
{
- worker = iter->second;
if (worker->mHost != host)
{
llwarns << "LLTextureFetch::createRequest " << id << " called with multiple hosts: "
@@ -1494,41 +1491,48 @@ bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, con
return false; // need to wait for previous aborted request to complete
}
worker->lockWorkMutex();
+ worker->mActiveCount++;
+ worker->mNeedsAux = needs_aux;
worker->setImagePriority(priority);
worker->setDesiredDiscard(desired_discard, desired_size);
- worker->unlockWorkMutex();
if (!worker->haveWork())
{
worker->mState = LLTextureFetchWorker::INIT;
+ worker->unlockWorkMutex();
+
worker->addWork(0, LLWorkerThread::PRIORITY_HIGH | worker->mWorkPriority);
}
+ else
+ {
+ worker->unlockWorkMutex();
+ }
}
else
{
worker = new LLTextureFetchWorker(this, url, id, host, priority, desired_discard, desired_size);
+ lockQueue() ;
mRequestMap[id] = worker;
+ unlockQueue() ;
+
+ worker->lockWorkMutex();
+ worker->mActiveCount++;
+ worker->mNeedsAux = needs_aux;
+ worker->unlockWorkMutex();
}
- worker->mActiveCount++;
- worker->mNeedsAux = needs_aux;
+
// llinfos << "REQUESTED: " << id << " Discard: " << desired_discard << llendl;
return true;
}
-void LLTextureFetch::deleteRequest(const LLUUID& id, bool cancel)
-{
- LLMutexLock lock(&mQueueMutex);
- LLTextureFetchWorker* worker = getWorker(id);
- if (worker)
- {
- removeRequest(worker, cancel);
- }
-}
-
// protected
void LLTextureFetch::addToNetworkQueue(LLTextureFetchWorker* worker)
{
+ lockQueue() ;
+ bool in_request_map = (mRequestMap.find(worker->mID) != mRequestMap.end()) ;
+ unlockQueue() ;
+
LLMutexLock lock(&mNetworkQueueMutex);
- if (mRequestMap.find(worker->mID) != mRequestMap.end())
+ if (in_request_map)
{
// only add to the queue if in the request map
// i.e. a delete has not been requested
@@ -1564,10 +1568,34 @@ void LLTextureFetch::removeFromHTTPQueue(const LLUUID& id)
mHTTPTextureQueue.erase(id);
}
-// call lockQueue() first!
+void LLTextureFetch::deleteRequest(const LLUUID& id, bool cancel)
+{
+ lockQueue() ;
+ LLTextureFetchWorker* worker = getWorkerAfterLock(id);
+ if (worker)
+ {
+ size_t erased_1 = mRequestMap.erase(worker->mID);
+ unlockQueue() ;
+
+ llassert_always(erased_1 > 0) ;
+
+ removeFromNetworkQueue(worker, cancel);
+ llassert_always(!(worker->getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) ;
+
+ worker->scheduleDelete();
+ }
+ else
+ {
+ unlockQueue() ;
+ }
+}
+
void LLTextureFetch::removeRequest(LLTextureFetchWorker* worker, bool cancel)
{
+ lockQueue() ;
size_t erased_1 = mRequestMap.erase(worker->mID);
+ unlockQueue() ;
+
llassert_always(erased_1 > 0) ;
removeFromNetworkQueue(worker, cancel);
llassert_always(!(worker->getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) ;
@@ -1575,8 +1603,26 @@ void LLTextureFetch::removeRequest(LLTextureFetchWorker* worker, bool cancel)
worker->scheduleDelete();
}
+S32 LLTextureFetch::getNumRequests()
+{
+ lockQueue() ;
+ S32 size = (S32)mRequestMap.size();
+ unlockQueue() ;
+
+ return size ;
+}
+
+S32 LLTextureFetch::getNumHTTPRequests()
+{
+ mNetworkQueueMutex.lock() ;
+ S32 size = (S32)mHTTPTextureQueue.size();
+ mNetworkQueueMutex.unlock() ;
+
+ return size ;
+}
+
// call lockQueue() first!
-LLTextureFetchWorker* LLTextureFetch::getWorker(const LLUUID& id)
+LLTextureFetchWorker* LLTextureFetch::getWorkerAfterLock(const LLUUID& id)
{
LLTextureFetchWorker* res = NULL;
map_t::iterator iter = mRequestMap.find(id);
@@ -1587,12 +1633,18 @@ LLTextureFetchWorker* LLTextureFetch::getWorker(const LLUUID& id)
return res;
}
+LLTextureFetchWorker* LLTextureFetch::getWorker(const LLUUID& id)
+{
+ LLMutexLock lock(&mQueueMutex) ;
+
+ return getWorkerAfterLock(id) ;
+}
+
bool LLTextureFetch::getRequestFinished(const LLUUID& id, S32& discard_level,
LLPointer<LLImageRaw>& raw, LLPointer<LLImageRaw>& aux)
{
bool res = false;
- LLMutexLock lock(&mQueueMutex);
LLTextureFetchWorker* worker = getWorker(id);
if (worker)
{
@@ -1644,7 +1696,6 @@ bool LLTextureFetch::getRequestFinished(const LLUUID& id, S32& discard_level,
bool LLTextureFetch::updateRequestPriority(const LLUUID& id, F32 priority)
{
bool res = false;
- LLMutexLock lock(&mQueueMutex);
LLTextureFetchWorker* worker = getWorker(id);
if (worker)
{
@@ -1760,8 +1811,6 @@ void LLTextureFetch::sendRequestListToSimulators()
}
timer.reset();
- LLMutexLock lock(&mQueueMutex);
-
// Send requests
typedef std::set<LLTextureFetchWorker*,LLTextureFetchWorker::Compare> request_list_t;
typedef std::map< LLHost, request_list_t > work_request_map_t;
@@ -1970,7 +2019,6 @@ bool LLTextureFetchWorker::insertPacket(S32 index, U8* data, S32 size)
bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8 codec, U16 packets, U32 totalbytes,
U16 data_size, U8* data)
{
- LLMutexLock lock(&mQueueMutex);
LLTextureFetchWorker* worker = getWorker(id);
bool res = true;
@@ -2003,7 +2051,9 @@ bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8
if (!res)
{
++mBadPacketCount;
+ mNetworkQueueMutex.lock() ;
mCancelQueue[host].insert(id);
+ mNetworkQueueMutex.unlock() ;
return false;
}
@@ -2024,7 +2074,6 @@ bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8
bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U16 packet_num, U16 data_size, U8* data)
{
- LLMutexLock lock(&mQueueMutex);
LLTextureFetchWorker* worker = getWorker(id);
bool res = true;
@@ -2048,7 +2097,9 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1
if (!res)
{
++mBadPacketCount;
+ mNetworkQueueMutex.lock() ;
mCancelQueue[host].insert(id);
+ mNetworkQueueMutex.unlock() ;
return false;
}
@@ -2088,7 +2139,6 @@ BOOL LLTextureFetch::isFromLocalCache(const LLUUID& id)
{
BOOL from_cache = FALSE ;
- LLMutexLock lock(&mQueueMutex);
LLTextureFetchWorker* worker = getWorker(id);
if (worker)
{
@@ -2110,7 +2160,6 @@ S32 LLTextureFetch::getFetchState(const LLUUID& id, F32& data_progress_p, F32& r
F32 request_dtime = 999999.f;
U32 fetch_priority = 0;
- LLMutexLock lock(&mQueueMutex);
LLTextureFetchWorker* worker = getWorker(id);
if (worker && worker->haveWork())
{
diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h
index 373e38a83c..5213c4f488 100644
--- a/indra/newview/lltexturefetch.h
+++ b/indra/newview/lltexturefetch.h
@@ -77,13 +77,14 @@ public:
S32 getFetchState(const LLUUID& id, F32& decode_progress_p, F32& requested_priority_p,
U32& fetch_priority_p, F32& fetch_dtime_p, F32& request_dtime_p);
void dump();
- S32 getNumRequests() { return mRequestMap.size(); }
- S32 getNumHTTPRequests() { return mHTTPTextureQueue.size(); }
+ S32 getNumRequests() ;
+ S32 getNumHTTPRequests() ;
// Public for access by callbacks
void lockQueue() { mQueueMutex.lock(); }
void unlockQueue() { mQueueMutex.unlock(); }
LLTextureFetchWorker* getWorker(const LLUUID& id);
+ LLTextureFetchWorker* getWorkerAfterLock(const LLUUID& id);
LLTextureInfo* getTextureInfo() { return &mTextureInfo; }
@@ -92,7 +93,7 @@ protected:
void removeFromNetworkQueue(LLTextureFetchWorker* worker, bool cancel);
void addToHTTPQueue(const LLUUID& id);
void removeFromHTTPQueue(const LLUUID& id);
- S32 getHTTPQueueSize() { return (S32)mHTTPTextureQueue.size(); }
+ S32 getHTTPQueueSize() { return getNumHTTPRequests(); }
void removeRequest(LLTextureFetchWorker* worker, bool cancel);
// Called from worker thread (during doWork)
void processCurlRequests();
@@ -111,8 +112,8 @@ public:
S32 mBadPacketCount;
private:
- LLMutex mQueueMutex;
- LLMutex mNetworkQueueMutex;
+ LLMutex mQueueMutex; //to protect mRequestMap only
+ LLMutex mNetworkQueueMutex; //to protect mNetworkQueue, mHTTPTextureQueue and mCancelQueue.
LLTextureCache* mTextureCache;
LLImageDecodeThread* mImageDecodeThread;
diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp
index 7ae2404203..cb43beb819 100644
--- a/indra/newview/lltoastimpanel.cpp
+++ b/indra/newview/lltoastimpanel.cpp
@@ -141,32 +141,6 @@ BOOL LLToastIMPanel::handleToolTip(S32 x, S32 y, MASK mask)
return LLToastPanel::handleToolTip(x, y, mask);
}
-void LLToastIMPanel::showInspector()
-{
- LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mSessionID);
- if(!im_session)
- {
- llwarns << "Invalid IM session" << llendl;
- return;
- }
-
- switch(im_session->mSessionType)
- {
- case LLIMModel::LLIMSession::P2P_SESSION:
- LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", mAvatarID));
- break;
- case LLIMModel::LLIMSession::GROUP_SESSION:
- LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", mSessionID));
- break;
- case LLIMModel::LLIMSession::ADHOC_SESSION:
- LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", im_session->mOtherParticipantID));
- break;
- default:
- llwarns << "Unknown IM session type" << llendl;
- break;
- }
-}
-
void LLToastIMPanel::spawnNameToolTip()
{
// Spawn at right side of the name textbox.
@@ -176,7 +150,7 @@ void LLToastIMPanel::spawnNameToolTip()
LLToolTip::Params params;
params.background_visible(false);
- params.click_callback(boost::bind(&LLToastIMPanel::showInspector, this));
+ params.click_callback(boost::bind(&LLFloaterReg::showInstance, "inspect_avatar", LLSD().with("avatar_id", mAvatarID), FALSE));
params.delay_time(0.0f); // spawn instantly on hover
params.image(LLUI::getUIImage("Info_Small"));
params.message("");
@@ -201,7 +175,7 @@ void LLToastIMPanel::spawnGroupIconToolTip()
LLInspector::Params params;
params.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
- params.click_callback(boost::bind(&LLToastIMPanel::showInspector, this));
+ params.click_callback(boost::bind(&LLFloaterReg::showInstance, "inspect_group", LLSD().with("group_id", mSessionID), FALSE));
params.delay_time(0.100f);
params.image(LLUI::getUIImage("Info_Small"));
params.message(g_data.mName);
@@ -214,16 +188,15 @@ void LLToastIMPanel::spawnGroupIconToolTip()
void LLToastIMPanel::initIcon()
{
- LLIconCtrl* sys_msg_icon = getChild<LLIconCtrl>("sys_msg_icon");
-
mAvatarIcon->setVisible(FALSE);
mGroupIcon->setVisible(FALSE);
- sys_msg_icon->setVisible(FALSE);
mAdhocIcon->setVisible(FALSE);
if(mAvatarName->getValue().asString() == SYSTEM_FROM)
{
- sys_msg_icon->setVisible(TRUE);
+ // "sys_msg_icon" was disabled by Erica in the changeset: 5109 (85181bc92cbe)
+ // and "dummy widget" warnings appeared in log.
+ // It does not make sense to have such image with empty name. Removed for EXT-5057.
}
else
{
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index 4d741456c4..980b51337f 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -294,6 +294,15 @@ void LLToastNotifyPanel::adjustPanelForTipNotice()
mControlPanel->setVisible(FALSE);
reshape(getRect().getWidth(), mInfoPanel->getRect().getHeight());
+
+ if (mNotification->getPayload().has("respond_on_mousedown")
+ && mNotification->getPayload()["respond_on_mousedown"] )
+ {
+ mInfoPanel->setMouseDownCallback(
+ boost::bind(&LLNotification::respond,
+ mNotification,
+ mNotification->getResponseTemplate()));
+ }
}
// static
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 125c62474e..05da022fb4 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -385,6 +385,7 @@ LLToolDragAndDrop::LLDragAndDropDictionary::LLDragAndDropDictionary()
addEntry(DAD_ANIMATION, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
addEntry(DAD_GESTURE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dActivateGesture, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
addEntry(DAD_LINK, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_MESH, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dMeshObject, &LLToolDragAndDrop::dad3dNULL));
// TODO: animation on self could play it? edit it?
// TODO: gesture on self could play it? edit it?
};
@@ -1085,6 +1086,31 @@ void LLToolDragAndDrop::dropTextureAllFaces(LLViewerObject* hit_obj,
hit_obj->sendTEUpdate();
}
+void LLToolDragAndDrop::dropMesh(LLViewerObject* hit_obj,
+ LLInventoryItem* item,
+ LLToolDragAndDrop::ESource source,
+ const LLUUID& src_id)
+{
+ if (!item)
+ {
+ llwarns << "no inventory item." << llendl;
+ return;
+ }
+ LLUUID asset_id = item->getAssetUUID();
+ BOOL success = handleDropTextureProtections(hit_obj, item, source, src_id);
+ if(!success)
+ {
+ return;
+ }
+
+ LLSculptParams sculpt_params;
+ sculpt_params.setSculptTexture(asset_id);
+ sculpt_params.setSculptType(LL_SCULPT_TYPE_MESH);
+ hit_obj->setParameterEntry(LLNetworkData::PARAMS_SCULPT, sculpt_params, TRUE);
+
+ dialog_refresh_all();
+}
+
/*
void LLToolDragAndDrop::dropTextureOneFaceAvatar(LLVOAvatar* avatar, S32 hit_face, LLInventoryItem* item)
{
@@ -1906,6 +1932,7 @@ bool LLToolDragAndDrop::handleGiveDragAndDrop(LLUUID dest_agent, LLUUID session_
case DAD_ANIMATION:
case DAD_GESTURE:
case DAD_CALLINGCARD:
+ case DAD_MESH:
{
LLViewerInventoryItem* inv_item = (LLViewerInventoryItem*)cargo_data;
if(gInventory.getItem(inv_item->getUUID())
@@ -2200,10 +2227,10 @@ EAcceptance LLToolDragAndDrop::dad3dRezScript(
return rv;
}
-EAcceptance LLToolDragAndDrop::dad3dTextureObject(
- LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
+EAcceptance LLToolDragAndDrop::dad3dApplyToObject(
+ LLViewerObject* obj, S32 face, MASK mask, BOOL drop, EDragAndDropType cargo_type)
{
- lldebugs << "LLToolDragAndDrop::dad3dTextureObject()" << llendl;
+ lldebugs << "LLToolDragAndDrop::dad3dApplyToObject()" << llendl;
// *HACK: In order to resolve SL-22177, we need to block drags
// from notecards and objects onto other objects.
@@ -2237,13 +2264,24 @@ EAcceptance LLToolDragAndDrop::dad3dTextureObject(
if(drop && (ACCEPT_YES_SINGLE <= rv))
{
- if((mask & MASK_SHIFT))
+ if (cargo_type == DAD_TEXTURE)
{
- dropTextureAllFaces(obj, item, mSource, mSourceID);
+ if((mask & MASK_SHIFT))
+ {
+ dropTextureAllFaces(obj, item, mSource, mSourceID);
+ }
+ else
+ {
+ dropTextureOneFace(obj, face, item, mSource, mSourceID);
+ }
+ }
+ else if (cargo_type == DAD_MESH)
+ {
+ dropMesh(obj, item, mSource, mSourceID);
}
else
{
- dropTextureOneFace(obj, face, item, mSource, mSourceID);
+ llwarns << "unsupported asset type" << llendl;
}
// VEFFECT: SetTexture
@@ -2257,6 +2295,23 @@ EAcceptance LLToolDragAndDrop::dad3dTextureObject(
// enable multi-drop, although last texture will win
return ACCEPT_YES_MULTI;
}
+
+
+EAcceptance LLToolDragAndDrop::dad3dTextureObject(
+ LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
+{
+ return dad3dApplyToObject(obj, face, mask, drop, DAD_TEXTURE);
+}
+
+EAcceptance LLToolDragAndDrop::dad3dMeshObject(
+ LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
+{
+ return dad3dApplyToObject(obj, face, mask, drop, DAD_MESH);
+}
+
+
+
+
/*
EAcceptance LLToolDragAndDrop::dad3dTextureSelf(
LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h
index 79b2bc32a3..8a19eb6c9c 100644
--- a/indra/newview/lltooldraganddrop.h
+++ b/indra/newview/lltooldraganddrop.h
@@ -154,6 +154,8 @@ protected:
MASK mask, BOOL drop);
EAcceptance dad3dTextureObject(LLViewerObject* obj, S32 face,
MASK mask, BOOL drop);
+ EAcceptance dad3dMeshObject(LLViewerObject* obj, S32 face,
+ MASK mask, BOOL drop);
// EAcceptance dad3dTextureSelf(LLViewerObject* obj, S32 face,
// MASK mask, BOOL drop);
EAcceptance dad3dWearItem(LLViewerObject* obj, S32 face,
@@ -185,6 +187,11 @@ protected:
EAcceptance dad3dActivateGesture(LLViewerObject *obj, S32 face,
MASK mask, BOOL drop);
+ // helper called by methods above to handle "application" of an item
+ // to an object (texture applied to face, mesh applied to shape, etc.)
+ EAcceptance dad3dApplyToObject(LLViewerObject* obj, S32 face, MASK mask, BOOL drop, EDragAndDropType cargo_type);
+
+
// set the LLToolDragAndDrop's cursor based on the given acceptance
ECursorType acceptanceToCursor( EAcceptance acceptance );
@@ -253,6 +260,11 @@ public:
LLInventoryItem* item,
ESource source,
const LLUUID& src_id);
+ static void dropMesh(LLViewerObject* hit_obj,
+ LLInventoryItem* item,
+ ESource source,
+ const LLUUID& src_id);
+
//static void dropTextureOneFaceAvatar(LLVOAvatar* avatar,S32 hit_face,
// LLInventoryItem* item)
diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp
index 4fb75f7a49..5f825b461e 100644
--- a/indra/newview/lltoolmorph.cpp
+++ b/indra/newview/lltoolmorph.cpp
@@ -167,13 +167,16 @@ BOOL LLVisualParamHint::render()
LLVisualParamReset::sDirty = TRUE;
LLVOAvatar* avatarp = gAgent.getAvatarObject();
+ gGL.pushUIMatrix();
+ gGL.loadUIIdentity();
+
glMatrixMode(GL_PROJECTION);
- glPushMatrix();
+ gGL.pushMatrix();
glLoadIdentity();
glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.pushMatrix();
glLoadIdentity();
LLGLSUIDefault gls_ui;
@@ -181,10 +184,10 @@ BOOL LLVisualParamHint::render()
mBackgroundp->draw(0, 0, mFullWidth, mFullHeight);
glMatrixMode(GL_PROJECTION);
- glPopMatrix();
+ gGL.popMatrix();
glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ gGL.popMatrix();
mNeedsUpdate = FALSE;
mIsVisible = TRUE;
@@ -247,6 +250,7 @@ BOOL LLVisualParamHint::render()
mVisualParam->setWeight(mLastParamWeight, FALSE);
gGL.color4f(1,1,1,1);
mGLTexturep->setGLTextureCreated(true);
+ gGL.popUIMatrix();
return TRUE;
}
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index bf1e307d71..fdf9e1df2e 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -1485,6 +1485,12 @@ BOOL LLToolPie::pickRightMouseDownCallback()
while( object && object->isAttachment())
{
object = (LLViewerObject*)object->getParent();
+ llassert(object);
+ }
+
+ if (!object)
+ {
+ return TRUE; // unexpected, but escape
}
// Object is an avatar, so check for mute by id.
diff --git a/indra/newview/llviewerassettype.cpp b/indra/newview/llviewerassettype.cpp
index b382ff6306..4c088a72b7 100644
--- a/indra/newview/llviewerassettype.cpp
+++ b/indra/newview/llviewerassettype.cpp
@@ -85,6 +85,8 @@ LLViewerAssetDictionary::LLViewerAssetDictionary()
addEntry(LLViewerAssetType::AT_LINK, new ViewerAssetEntry(DAD_LINK));
addEntry(LLViewerAssetType::AT_LINK_FOLDER, new ViewerAssetEntry(DAD_LINK));
+ addEntry(LLViewerAssetType::AT_MESH, new ViewerAssetEntry(DAD_MESH));
+
addEntry(LLViewerAssetType::AT_NONE, new ViewerAssetEntry(DAD_NONE));
};
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 827d34138f..0b7f6900ed 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -510,6 +510,7 @@ void settings_setup_listeners()
gSavedSettings.getControl("FirstPersonAvatarVisible")->getSignal()->connect(boost::bind(&handleRenderAvatarMouselookChanged, _2));
gSavedSettings.getControl("RenderFarClip")->getSignal()->connect(boost::bind(&handleRenderFarClipChanged, _2));
gSavedSettings.getControl("RenderTerrainDetail")->getSignal()->connect(boost::bind(&handleTerrainDetailChanged, _2));
+ gSavedSettings.getControl("RenderUseTriStrips")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderAnimateTrees")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderAvatarVP")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("VertexShaderEnable")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index ba256d70e8..356d8467c0 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -862,19 +862,17 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
if (LLPipeline::sRenderDeferred && !LLPipeline::sUnderWaterRender)
{
gPipeline.mDeferredScreen.flush();
+ LLRenderTarget::copyContentsToFramebuffer(gPipeline.mDeferredScreen, 0, 0, gPipeline.mDeferredScreen.getWidth(), gPipeline.mDeferredScreen.getHeight(),
+ 0, 0, gPipeline.mDeferredScreen.getWidth(), gPipeline.mDeferredScreen.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);
}
else
{
gPipeline.mScreen.flush();
+ LLRenderTarget::copyContentsToFramebuffer(gPipeline.mScreen, 0, 0, gPipeline.mScreen.getWidth(), gPipeline.mScreen.getHeight(),
+ 0, 0, gPipeline.mScreen.getWidth(), gPipeline.mScreen.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);
}
}
- /// We copy the frame buffer straight into a texture here,
- /// and then display it again with compositor effects.
- /// Using render to texture would be faster/better, but I don't have a
- /// grasp of their full display stack just yet.
- // gPostProcess->apply(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());
-
if (LLPipeline::sRenderDeferred && !LLPipeline::sUnderWaterRender)
{
gPipeline.renderDeferredLighting();
@@ -1117,7 +1115,7 @@ void render_ui(F32 zoom_factor, int subfield)
{
gPipeline.renderBloom(gSnapshot, zoom_factor, subfield);
}
-
+
render_hud_elements();
render_hud_attachments();
}
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 29114c33c5..145c717020 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -55,6 +55,7 @@
#include "llfloaterbump.h"
#include "llfloatercamera.h"
#include "llfloaterdaycycle.h"
+#include "llfloaterevent.h"
#include "llfloatersearch.h"
#include "llfloaterenvsettings.h"
#include "llfloaterfonttest.h"
@@ -70,6 +71,7 @@
#include "llimfloater.h"
#include "llfloaterinspect.h"
#include "llfloaterinventory.h"
+#include "llfloaterimportcollada.h"
#include "llfloaterjoystick.h"
#include "llfloaterlagmeter.h"
#include "llfloaterland.h"
@@ -125,6 +127,8 @@
#include "llpreviewtexture.h"
#include "llsyswellwindow.h"
#include "llscriptfloater.h"
+#include "llfloatermodelpreview.h"
+
// *NOTE: Please add files in alphabetical order to keep merges easy.
@@ -160,6 +164,8 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("env_settings", "floater_env_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEnvSettings>);
LLFloaterReg::add("env_water", "floater_water.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWater>);
LLFloaterReg::add("env_windlight", "floater_windlight_options.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWindLight>);
+
+ LLFloaterReg::add("event", "floater_event.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEvent>);
LLFloaterReg::add("font_test", "floater_font_test.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterFontTest>);
@@ -171,6 +177,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("hud", "floater_hud.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHUD>);
LLFloaterReg::add("impanel", "floater_im_session.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloater>);
+ LLFloaterReg::add("import_collada", "floater_import_collada.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterImportCollada>);
LLFloaterReg::add("im_container", "floater_im_container.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloaterContainer>);
LLFloaterReg::add("im_well_window", "floater_sys_well.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMWellWindow>);
LLFloaterReg::add("incoming_call", "floater_incoming_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIncomingCallDialog>);
@@ -251,7 +258,8 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("upload_anim", "floater_animation_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAnimPreview>, "upload");
LLFloaterReg::add("upload_image", "floater_image_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterImagePreview>, "upload");
LLFloaterReg::add("upload_sound", "floater_sound_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundPreview>, "upload");
-
+ LLFloaterReg::add("upload_model", "floater_model_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterModelPreview>, "upload");
+
LLFloaterReg::add("voice_controls", "floater_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLCallFloater>);
LLFloaterReg::add("whitelist_entry", "floater_whitelist_entry.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWhiteListEntry>);
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 3001992630..b69eaa4853 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -649,6 +649,8 @@ bool LLViewerInventoryCategory::exportFileLocal(LLFILE* fp) const
void LLViewerInventoryCategory::determineFolderType()
{
+ /* Do NOT uncomment this code. This is for future 2.1 support of ensembles.
+ llassert(FALSE);
LLFolderType::EType original_type = getPreferredType();
if (LLFolderType::lookupIsProtectedType(original_type))
return;
@@ -692,6 +694,8 @@ void LLViewerInventoryCategory::determineFolderType()
{
changeType(LLFolderType::FT_NONE);
}
+ llassert(FALSE);
+ */
}
void LLViewerInventoryCategory::changeType(LLFolderType::EType new_folder_type)
diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp
index 1a67fc0966..7225aa1523 100644
--- a/indra/newview/llviewerjointmesh.cpp
+++ b/indra/newview/llviewerjointmesh.cpp
@@ -626,7 +626,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
mFace->mVertexBuffer->drawRange(LLRender::TRIANGLES, start, end, count, offset);
glPopMatrix();
}
- gPipeline.addTrianglesDrawn(count/3);
+ gPipeline.addTrianglesDrawn(count);
triangle_count += count;
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 9ced0194a2..0e133f8729 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -57,6 +57,7 @@
#include "llkeyboard.h"
#include "llmutelist.h"
//#include "llfirstuse.h"
+#include "llwindow.h"
#include <boost/bind.hpp> // for SkinFolder listener
#include <boost/signals2.hpp>
@@ -712,7 +713,6 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
std::vector<LLViewerMediaImpl*> proximity_order;
bool inworld_media_enabled = gSavedSettings.getBOOL("AudioStreamingMedia");
- bool needs_first_run = LLViewerMedia::needsMediaFirstRun();
U32 max_instances = gSavedSettings.getU32("PluginInstancesTotal");
U32 max_normal = gSavedSettings.getU32("PluginInstancesNormal");
U32 max_low = gSavedSettings.getU32("PluginInstancesLow");
@@ -838,12 +838,6 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
if(!pimpl->getUsedInUI())
{
new_priority = LLPluginClassMedia::PRIORITY_UNLOADED;
- if(needs_first_run)
- {
- // Don't do this more than once in this loop.
- needs_first_run = false;
- LLViewerMedia::displayMediaFirstRun();
- }
}
}
@@ -913,59 +907,6 @@ void LLViewerMedia::cleanupClass()
gIdleCallbacks.deleteFunction(LLViewerMedia::updateMedia, NULL);
}
-
-//////////////////////////////////////////////////////////////////////////////////////////
-// static
-bool LLViewerMedia::needsMediaFirstRun()
-{
- return gWarningSettings.getBOOL("FirstStreamingMedia");
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////
-// static
-void LLViewerMedia::displayMediaFirstRun()
-{
- gWarningSettings.setBOOL("FirstStreamingMedia", FALSE);
-
- LLNotificationsUtil::add("ParcelCanPlayMedia", LLSD(), LLSD(),
- boost::bind(firstRunCallback, _1, _2));
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////
-// static
-bool LLViewerMedia::firstRunCallback(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if (option == 0)
- {
- // user has elected to automatically play media.
- gSavedSettings.setBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING, TRUE);
- gSavedSettings.setBOOL("AudioStreamingMusic", TRUE);
- gSavedSettings.setBOOL("AudioStreamingMedia", TRUE);
-
- LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
-
- if (parcel)
- {
- // play media right now, if available
- LLViewerParcelMedia::play(parcel);
-
- // play music right now, if available
- std::string music_url = parcel->getMusicURL();
- if (gAudiop && !music_url.empty())
- gAudiop->startInternetStream(music_url);
- }
- }
- else
- {
- gSavedSettings.setBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING, FALSE);
- gSavedSettings.setBOOL("AudioStreamingMedia", FALSE);
- gSavedSettings.setBOOL("AudioStreamingMusic", FALSE);
- }
- return false;
-}
-
-
//////////////////////////////////////////////////////////////////////////////////////////
// LLViewerMediaImpl
//////////////////////////////////////////////////////////////////////////////////////////
@@ -1839,9 +1780,12 @@ bool LLViewerMediaImpl::handleKeyHere(KEY key, MASK mask)
if(!result)
{
- result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_DOWN ,key, mask);
+
+ LLSD native_key_data = gViewerWindow->getWindow()->getNativeKeyData();
+
+ result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_DOWN ,key, mask, native_key_data);
// Since the viewer internal event dispatching doesn't give us key-up events, simulate one here.
- (void)mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_UP ,key, mask);
+ (void)mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_UP ,key, mask, native_key_data);
}
}
@@ -1859,7 +1803,9 @@ bool LLViewerMediaImpl::handleUnicodeCharHere(llwchar uni_char)
if (uni_char >= 32 // discard 'control' characters
&& uni_char != 127) // SDL thinks this is 'delete' - yuck.
{
- mMediaSource->textInput(wstring_to_utf8str(LLWString(1, uni_char)), gKeyboard->currentMask(FALSE));
+ LLSD native_key_data = gViewerWindow->getWindow()->getNativeKeyData();
+
+ mMediaSource->textInput(wstring_to_utf8str(LLWString(1, uni_char)), gKeyboard->currentMask(FALSE), native_key_data);
}
}
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index ff18ed605a..daad70f14f 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -117,11 +117,6 @@ class LLViewerMedia
// This is the comparitor used to sort the list.
static bool priorityComparitor(const LLViewerMediaImpl* i1, const LLViewerMediaImpl* i2);
- // For displaying the media first-run dialog.
- static bool needsMediaFirstRun();
- static void displayMediaFirstRun();
- static bool firstRunCallback(const LLSD& notification, const LLSD& response);
-
};
// Implementation functions not exported into header file
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index a0ac9c2091..f508a3462a 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -157,7 +157,6 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
mFocusedObjectFace = 0;
}
}
-
}
void LLViewerMediaFocus::clearFocus()
@@ -198,7 +197,7 @@ bool LLViewerMediaFocus::getFocus()
}
// This function selects an ideal viewing distance based on the focused object, pick normal, and padding value
-void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor)
+void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor, bool zoom_in_only)
{
if (object)
{
@@ -269,7 +268,16 @@ void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal,
camera_pos += 0.01 * len * delta;
}
+ // If we are not allowing zooming out and the old camera position is closer to
+ // the center then the new intended camera position, don't move camera and return
+ if (zoom_in_only &&
+ (dist_vec_squared(gAgent.getCameraPositionGlobal(), target_pos) < dist_vec_squared(camera_pos, target_pos)))
+ {
+ return;
+ }
+
gAgent.setCameraPosAndFocusGlobal(camera_pos, target_pos, object->getID() );
+
}
else
{
diff --git a/indra/newview/llviewermediafocus.h b/indra/newview/llviewermediafocus.h
index 89ee0ae283..002044ea2e 100644
--- a/indra/newview/llviewermediafocus.h
+++ b/indra/newview/llviewermediafocus.h
@@ -66,7 +66,7 @@ public:
void update();
- static void setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor);
+ static void setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor, bool zoom_in_only = false);
static F32 getBBoxAspectRatio(const LLBBox& bbox, const LLVector3& normal, F32* height, F32* width, F32* depth);
bool isFocusedOnFace(LLPointer<LLViewerObject> objectp, S32 face);
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index a83baf7f9a..1ff7920bb2 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -161,7 +161,6 @@ LLMenuItemCallGL* gBusyMenu = NULL;
// Local prototypes
// File Menu
-const char* upload_pick(void* data);
void handle_compress_image(void*);
@@ -445,6 +444,7 @@ void init_menus()
gMenuHolder->childSetLabelArg("Upload Sound", "[COST]", upload_cost);
gMenuHolder->childSetLabelArg("Upload Animation", "[COST]", upload_cost);
gMenuHolder->childSetLabelArg("Bulk Upload", "[COST]", upload_cost);
+ gMenuHolder->childSetLabelArg("Upload Model", "[COST]", upload_cost);
gAFKMenu = gMenuBarView->getChild<LLMenuItemCallGL>("Set Away", TRUE);
gBusyMenu = gMenuBarView->getChild<LLMenuItemCallGL>("Set Busy", TRUE);
@@ -2555,7 +2555,7 @@ void handle_object_inspect()
key["task"] = "task";
LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
}
-
+
/*
// Old floater properties
LLFloaterReg::showInstance("inspect", LLSD());
@@ -5332,7 +5332,7 @@ class LLWorldCreateLandmark : public view_listener_t
void handle_look_at_selection(const LLSD& param)
{
- const F32 PADDING_FACTOR = 2.f;
+ const F32 PADDING_FACTOR = 1.75f;
BOOL zoom = (param.asString() == "zoom");
if (!LLSelectMgr::getInstance()->getSelection()->isEmpty())
{
@@ -5352,14 +5352,19 @@ void handle_look_at_selection(const LLSD& param)
}
if (zoom)
{
+ // Make sure we are not increasing the distance between the camera and object
+ LLVector3d orig_distance = gAgent.getCameraPositionGlobal() - LLSelectMgr::getInstance()->getSelectionCenterGlobal();
+ distance = llmin(distance, (F32) orig_distance.length());
+
gAgent.setCameraPosAndFocusGlobal(LLSelectMgr::getInstance()->getSelectionCenterGlobal() + LLVector3d(obj_to_cam * distance),
- LLSelectMgr::getInstance()->getSelectionCenterGlobal(),
- object_id );
+ LLSelectMgr::getInstance()->getSelectionCenterGlobal(),
+ object_id );
+
}
else
{
gAgent.setFocusGlobal( LLSelectMgr::getInstance()->getSelectionCenterGlobal(), object_id );
- }
+ }
}
}
@@ -5594,8 +5599,6 @@ void handle_buy_currency()
LLFloaterBuyCurrency::buyCurrency();
}
-
-
class LLFloaterVisible : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -5625,19 +5628,39 @@ class LLShowSidetrayPanel : public view_listener_t
bool handleEvent(const LLSD& userdata)
{
std::string panel_name = userdata.asString();
- // Open up either the sidepanel or new floater.
- if (LLSideTray::getInstance()->isPanelActive(panel_name))
+ // Toggle the panel
+ if (!LLSideTray::getInstance()->isPanelActive(panel_name))
{
- LLFloaterInventory::showAgentInventory();
+ // LLFloaterInventory::showAgentInventory();
+ LLSideTray::getInstance()->showPanel(panel_name, LLSD());
}
else
{
- LLSideTray::getInstance()->showPanel(panel_name, LLSD());
+ LLSideTray::getInstance()->collapseSideBar();
}
return true;
}
};
+class LLSidetrayPanelVisible : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ std::string panel_name = userdata.asString();
+ // Toggle the panel
+ if (LLSideTray::getInstance()->isPanelActive(panel_name))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+
+ }
+};
+
+
bool callback_show_url(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
@@ -8022,6 +8045,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLFloaterVisible(), "FloaterVisible");
view_listener_t::addMenu(new LLShowSidetrayPanel(), "ShowSidetrayPanel");
+ view_listener_t::addMenu(new LLSidetrayPanelVisible(), "SidetrayPanelVisible");
view_listener_t::addMenu(new LLSomethingSelected(), "SomethingSelected");
view_listener_t::addMenu(new LLSomethingSelectedNoHUD(), "SomethingSelectedNoHUD");
view_listener_t::addMenu(new LLEditableSelected(), "EditableSelected");
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 6bad8843fd..0f26975149 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -39,6 +39,8 @@
#include "llfilepicker.h"
#include "llfloaterreg.h"
#include "llfloaterbuycurrency.h"
+#include "llfloaterimportcollada.h"
+#include "llfloatermodelpreview.h"
#include "llfloatersnapshot.h"
#include "llimage.h"
#include "llimagebmp.h"
@@ -63,7 +65,7 @@
#include "llappviewer.h"
#include "lluploaddialog.h"
#include "lltrans.h"
-
+#include "llfloaterimportcollada.h"
// linden libraries
#include "llassetuploadresponders.h"
@@ -71,6 +73,7 @@
#include "llhttpclient.h"
#include "llnotificationsutil.h"
#include "llsdserialize.h"
+#include "llsdutil.h"
#include "llstring.h"
#include "lltransactiontypes.h"
#include "lluuid.h"
@@ -102,6 +105,7 @@ static std::string XML_EXTENSIONS = "xml";
static std::string SLOBJECT_EXTENSIONS = "slobject";
#endif
static std::string ALL_FILE_EXTENSIONS = "*.*";
+static std::string MODEL_EXTENSIONS = "dae";
std::string build_extensions_string(LLFilePicker::ELoadFilter filter)
{
@@ -116,6 +120,8 @@ std::string build_extensions_string(LLFilePicker::ELoadFilter filter)
return ANIM_EXTENSIONS;
case LLFilePicker::FFLOAD_SLOBJECT:
return SLOBJECT_EXTENSIONS;
+ case LLFilePicker::FFLOAD_MODEL:
+ return MODEL_EXTENSIONS;
#ifdef _CORY_TESTING
case LLFilePicker::FFLOAD_GEOMETRY:
return GEOMETRY_EXTENSIONS;
@@ -259,6 +265,33 @@ class LLFileUploadImage : public view_listener_t
}
};
+class LLFileUploadScene : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ std::string filename = upload_pick((void *)LLFilePicker::FFLOAD_COLLADA);
+ if (!filename.empty())
+ {
+ LLImportCollada::getInstance()->importFile(filename);
+ }
+ return TRUE;
+ }
+};
+
+class LLFileUploadModel : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) LLFloaterReg::showInstance("upload_model");
+ if (fmp)
+ {
+ fmp->loadModel(3);
+ }
+
+ return TRUE;
+ }
+};
+
class LLFileUploadSound : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -320,10 +353,21 @@ class LLFileUploadBulk : public view_listener_t
LLAssetStorage::LLStoreAssetCallback callback = NULL;
S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
void *userdata = NULL;
- upload_new_resource(filename, asset_name, asset_name, 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
- LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
- display_name,
- callback, expected_upload_cost, userdata);
+
+ upload_new_resource(
+ filename,
+ asset_name,
+ asset_name,
+ 0,
+ LLFolderType::FT_NONE,
+ LLInventoryType::IT_NONE,
+ LLFloaterPerms::getNextOwnerPerms(),
+ LLFloaterPerms::getGroupPerms(),
+ LLFloaterPerms::getEveryonePerms(),
+ display_name,
+ callback,
+ expected_upload_cost,
+ userdata);
// *NOTE: Ew, we don't iterate over the file list here,
// we handle the next files in upload_done_callback()
@@ -479,17 +523,20 @@ void handle_compress_image(void*)
}
}
-void upload_new_resource(const std::string& src_filename, std::string name,
- std::string desc, S32 compression_info,
- LLFolderType::EType destination_folder_type,
- LLInventoryType::EType inv_type,
- U32 next_owner_perms,
- U32 group_perms,
- U32 everyone_perms,
- const std::string& display_name,
- LLAssetStorage::LLStoreAssetCallback callback,
- S32 expected_upload_cost,
- void *userdata)
+LLUUID upload_new_resource(
+ const std::string& src_filename,
+ std::string name,
+ std::string desc,
+ S32 compression_info,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms,
+ const std::string& display_name,
+ LLAssetStorage::LLStoreAssetCallback callback,
+ S32 expected_upload_cost,
+ void *userdata)
{
// Generate the temporary UUID.
std::string filename = gDirUtilp->getTempFilename();
@@ -514,7 +561,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
short_name.c_str());
args["FILE"] = short_name;
upload_error(error_message, "NofileExtension", filename, args);
- return;
+ return LLUUID();
}
else if( exten == "bmp")
{
@@ -528,7 +575,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
args["FILE"] = src_filename;
args["ERROR"] = LLImage::getLastError();
upload_error(error_message, "ProblemWithFile", filename, args);
- return;
+ return LLUUID();
}
}
else if( exten == "tga")
@@ -543,7 +590,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
args["FILE"] = src_filename;
args["ERROR"] = LLImage::getLastError();
upload_error(error_message, "ProblemWithFile", filename, args);
- return;
+ return LLUUID();
}
}
else if( exten == "jpg" || exten == "jpeg")
@@ -558,7 +605,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
args["FILE"] = src_filename;
args["ERROR"] = LLImage::getLastError();
upload_error(error_message, "ProblemWithFile", filename, args);
- return;
+ return LLUUID();
}
}
else if( exten == "png")
@@ -573,7 +620,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
args["FILE"] = src_filename;
args["ERROR"] = LLImage::getLastError();
upload_error(error_message, "ProblemWithFile", filename, args);
- return;
+ return LLUUID();
}
}
else if(exten == "wav")
@@ -601,7 +648,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
upload_error(error_message, "UnknownVorbisEncodeFailure", filename, args);
break;
}
- return;
+ return LLUUID();
}
}
else if(exten == "tmp")
@@ -641,7 +688,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
error_message = llformat("corrupt resource file: %s", src_filename.c_str());
args["FILE"] = src_filename;
upload_error(error_message, "CorruptResourceFile", filename, args);
- return;
+ return LLUUID();
}
if (2 == tokens_read)
@@ -669,7 +716,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
error_message = llformat("unknown linden resource file version in file: %s", src_filename.c_str());
args["FILE"] = src_filename;
upload_error(error_message, "UnknownResourceFileVersion", filename, args);
- return;
+ return LLUUID();
}
}
else
@@ -711,7 +758,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
error_message = llformat( "Unable to create output file: %s", filename.c_str());
args["FILE"] = filename;
upload_error(error_message, "UnableToCreateOutputFile", filename, args);
- return;
+ return LLUUID();
}
fclose(in);
@@ -725,7 +772,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
{
error_message = llformat("We do not currently support bulk upload of animation files\n");
upload_error(error_message, "DoNotSupportBulkAnimationUpload", filename, args);
- return;
+ return LLUUID();
}
else
{
@@ -771,9 +818,21 @@ void upload_new_resource(const std::string& src_filename, std::string name,
{
t_disp_name = src_filename;
}
- upload_new_resource(tid, asset_type, name, desc, compression_info, // tid
- destination_folder_type, inv_type, next_owner_perms, group_perms, everyone_perms,
- display_name, callback, expected_upload_cost, userdata);
+ upload_new_resource(
+ tid,
+ asset_type,
+ name,
+ desc,
+ compression_info, // tid
+ destination_folder_type,
+ inv_type,
+ next_owner_perms,
+ group_perms,
+ everyone_perms,
+ display_name,
+ callback,
+ expected_upload_cost,
+ userdata);
}
else
{
@@ -787,93 +846,103 @@ void upload_new_resource(const std::string& src_filename, std::string name,
}
LLFilePicker::instance().reset();
}
+
+ return uuid;
}
-void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExtStat ext_status) // StoreAssetData callback (fixed)
+void upload_done_callback(
+ const LLUUID& uuid,
+ void* user_data,
+ S32 result,
+ LLExtStat ext_status) // StoreAssetData callback (fixed)
{
LLResourceData* data = (LLResourceData*)user_data;
S32 expected_upload_cost = data ? data->mExpectedUploadCost : 0;
//LLAssetType::EType pref_loc = data->mPreferredLocation;
BOOL is_balance_sufficient = TRUE;
- if(result >= 0)
+ if(data)
{
- LLFolderType::EType dest_loc = (data->mPreferredLocation == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(data->mAssetInfo.mType) : data->mPreferredLocation;
-
- if (LLAssetType::AT_SOUND == data->mAssetInfo.mType ||
- LLAssetType::AT_TEXTURE == data->mAssetInfo.mType ||
- LLAssetType::AT_ANIMATION == data->mAssetInfo.mType)
+ if (result >= 0)
{
- // Charge the user for the upload.
- LLViewerRegion* region = gAgent.getRegion();
-
- if(!(can_afford_transaction(expected_upload_cost)))
- {
- LLFloaterBuyCurrency::buyCurrency(
- llformat(LLTrans::getString("UploadingCosts").c_str(),
- data->mAssetInfo.getName().c_str()),
- expected_upload_cost);
- is_balance_sufficient = FALSE;
- }
- else if(region)
+ LLFolderType::EType dest_loc = (data->mPreferredLocation == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(data->mAssetInfo.mType) : data->mPreferredLocation;
+
+ if (LLAssetType::AT_SOUND == data->mAssetInfo.mType ||
+ LLAssetType::AT_TEXTURE == data->mAssetInfo.mType ||
+ LLAssetType::AT_ANIMATION == data->mAssetInfo.mType)
{
- // Charge user for upload
- gStatusBar->debitBalance(expected_upload_cost);
+ // Charge the user for the upload.
+ LLViewerRegion* region = gAgent.getRegion();
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessageFast(_PREHASH_MoneyTransferRequest);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_MoneyData);
- msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_DestID, LLUUID::null);
- msg->addU8("Flags", 0);
- // we tell the sim how much we were expecting to pay so it
- // can respond to any discrepancy
- msg->addS32Fast(_PREHASH_Amount, expected_upload_cost);
- msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY);
- msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY);
- msg->addS32Fast(_PREHASH_TransactionType, TRANS_UPLOAD_CHARGE);
- msg->addStringFast(_PREHASH_Description, NULL);
- msg->sendReliable(region->getHost());
+ if(!(can_afford_transaction(expected_upload_cost)))
+ {
+ LLFloaterBuyCurrency::buyCurrency(
+ llformat(LLTrans::getString("UploadingCosts").c_str(),
+ data->mAssetInfo.getName().c_str()),
+ expected_upload_cost);
+ is_balance_sufficient = FALSE;
+ }
+ else if(region)
+ {
+ // Charge user for upload
+ gStatusBar->debitBalance(expected_upload_cost);
+
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_MoneyTransferRequest);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_MoneyData);
+ msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_DestID, LLUUID::null);
+ msg->addU8("Flags", 0);
+ // we tell the sim how much we were expecting to pay so it
+ // can respond to any discrepancy
+ msg->addS32Fast(_PREHASH_Amount, expected_upload_cost);
+ msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY);
+ msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY);
+ msg->addS32Fast(_PREHASH_TransactionType, TRANS_UPLOAD_CHARGE);
+ msg->addStringFast(_PREHASH_Description, NULL);
+ msg->sendReliable(region->getHost());
+ }
}
- }
- if(is_balance_sufficient)
- {
- // Actually add the upload to inventory
- llinfos << "Adding " << uuid << " to inventory." << llendl;
- const LLUUID folder_id = gInventory.findCategoryUUIDForType(dest_loc);
- if(folder_id.notNull())
+ if(is_balance_sufficient)
{
- U32 next_owner_perms = data->mNextOwnerPerm;
- if(PERM_NONE == next_owner_perms)
+ // Actually add the upload to inventory
+ llinfos << "Adding " << uuid << " to inventory." << llendl;
+ const LLUUID folder_id = gInventory.findCategoryUUIDForType(dest_loc);
+ if(folder_id.notNull())
{
- next_owner_perms = PERM_MOVE | PERM_TRANSFER;
+ U32 next_owner_perms = data->mNextOwnerPerm;
+ if(PERM_NONE == next_owner_perms)
+ {
+ next_owner_perms = PERM_MOVE | PERM_TRANSFER;
+ }
+ create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
+ folder_id, data->mAssetInfo.mTransactionID, data->mAssetInfo.getName(),
+ data->mAssetInfo.getDescription(), data->mAssetInfo.mType,
+ data->mInventoryType, NOT_WEARABLE, next_owner_perms,
+ LLPointer<LLInventoryCallback>(NULL));
+ }
+ else
+ {
+ llwarns << "Can't find a folder to put it in" << llendl;
}
- create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
- folder_id, data->mAssetInfo.mTransactionID, data->mAssetInfo.getName(),
- data->mAssetInfo.getDescription(), data->mAssetInfo.mType,
- data->mInventoryType, NOT_WEARABLE, next_owner_perms,
- LLPointer<LLInventoryCallback>(NULL));
- }
- else
- {
- llwarns << "Can't find a folder to put it in" << llendl;
}
}
- }
- else // if(result >= 0)
- {
- LLSD args;
- args["FILE"] = LLInventoryType::lookupHumanReadable(data->mInventoryType);
- args["REASON"] = std::string(LLAssetStorage::getErrorString(result));
- LLNotificationsUtil::add("CannotUploadReason", args);
+ else // if(result >= 0)
+ {
+ LLSD args;
+ args["FILE"] = LLInventoryType::lookupHumanReadable(data->mInventoryType);
+ args["REASON"] = std::string(LLAssetStorage::getErrorString(result));
+ LLNotificationsUtil::add("CannotUploadReason", args);
+ }
}
LLUploadDialog::modalUploadFinished();
delete data;
+ data = NULL;
// *NOTE: This is a pretty big hack. What this does is check the
// file picker if there are any more pending uploads. If so,
@@ -890,70 +959,97 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt
std::string display_name = LLStringUtil::null;
LLAssetStorage::LLStoreAssetCallback callback = NULL;
void *userdata = NULL;
- upload_new_resource(next_file, asset_name, asset_name, // file
- 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
- PERM_NONE, PERM_NONE, PERM_NONE,
- display_name,
- callback,
- expected_upload_cost, // assuming next in a group of uploads is of roughly the same type, i.e. same upload cost
- userdata);
+ upload_new_resource(
+ next_file,
+ asset_name,
+ asset_name, // file
+ 0,
+ LLFolderType::FT_NONE,
+ LLInventoryType::IT_NONE,
+ PERM_NONE,
+ PERM_NONE,
+ PERM_NONE,
+ display_name,
+ callback,
+ expected_upload_cost, // assuming next in a group of uploads is of roughly the same type, i.e. same upload cost
+ userdata);
}
}
-void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_type,
- std::string name,
- std::string desc, S32 compression_info,
- LLFolderType::EType destination_folder_type,
- LLInventoryType::EType inv_type,
- U32 next_owner_perms,
- U32 group_perms,
- U32 everyone_perms,
- const std::string& display_name,
- LLAssetStorage::LLStoreAssetCallback callback,
- S32 expected_upload_cost,
- void *userdata)
+static LLAssetID upload_new_resource_prep(
+ const LLTransactionID& tid,
+ LLAssetType::EType asset_type,
+ LLInventoryType::EType& inventory_type,
+ std::string& name,
+ const std::string& display_name,
+ std::string& description)
{
- if(gDisconnected)
- {
- return ;
- }
+ LLAssetID uuid = generate_asset_id_for_new_upload(tid);
- LLAssetID uuid = tid.makeAssetID(gAgent.getSecureSessionID());
-
- if( LLAssetType::AT_SOUND == asset_type )
- {
- LLViewerStats::getInstance()->incStat(LLViewerStats::ST_UPLOAD_SOUND_COUNT );
- }
- else
- if( LLAssetType::AT_TEXTURE == asset_type )
- {
- LLViewerStats::getInstance()->incStat(LLViewerStats::ST_UPLOAD_TEXTURE_COUNT );
- }
- else
- if( LLAssetType::AT_ANIMATION == asset_type)
- {
- LLViewerStats::getInstance()->incStat(LLViewerStats::ST_UPLOAD_ANIM_COUNT );
- }
+ increase_new_upload_stats(asset_type);
- if(LLInventoryType::IT_NONE == inv_type)
- {
- inv_type = LLInventoryType::defaultForAssetType(asset_type);
- }
- LLStringUtil::stripNonprintable(name);
- LLStringUtil::stripNonprintable(desc);
- if(name.empty())
- {
- name = "(No Name)";
- }
- if(desc.empty())
- {
- desc = "(No Description)";
- }
-
- // At this point, we're ready for the upload.
- std::string upload_message = "Uploading...\n\n";
- upload_message.append(display_name);
- LLUploadDialog::modalUploadDialog(upload_message);
+ assign_defaults_and_show_upload_message(
+ asset_type,
+ inventory_type,
+ name,
+ display_name,
+ description);
+
+ return uuid;
+}
+
+LLSD generate_new_resource_upload_capability_body(
+ LLAssetType::EType asset_type,
+ const std::string& name,
+ const std::string& desc,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms)
+{
+ LLSD body;
+
+ body["folder_id"] = gInventory.findCategoryUUIDForType(
+ (destination_folder_type == LLFolderType::FT_NONE) ?
+ (LLFolderType::EType) asset_type :
+ destination_folder_type);
+
+ body["asset_type"] = LLAssetType::lookup(asset_type);
+ body["inventory_type"] = LLInventoryType::lookup(inv_type);
+ body["name"] = name;
+ body["description"] = desc;
+ body["next_owner_mask"] = LLSD::Integer(next_owner_perms);
+ body["group_mask"] = LLSD::Integer(group_perms);
+ body["everyone_mask"] = LLSD::Integer(everyone_perms);
+
+ return body;
+}
+
+void upload_new_resource(
+ const LLTransactionID &tid,
+ LLAssetType::EType asset_type,
+ std::string name,
+ std::string desc,
+ S32 compression_info,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms,
+ const std::string& display_name,
+ LLAssetStorage::LLStoreAssetCallback callback,
+ S32 expected_upload_cost,
+ void *userdata)
+{
+ LLAssetID uuid =
+ upload_new_resource_prep(
+ tid,
+ asset_type,
+ inv_type,
+ name,
+ display_name,
+ desc);
llinfos << "*** Uploading: " << llendl;
llinfos << "Type: " << LLAssetType::lookup(asset_type) << llendl;
@@ -963,26 +1059,32 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty
llinfos << "Expected Upload Cost: " << expected_upload_cost << llendl;
lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type) << llendl;
lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl;
- std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory");
- if (!url.empty())
+
+ std::string url = gAgent.getRegion()->getCapability(
+ "NewFileAgentInventory");
+
+ if ( !url.empty() )
{
llinfos << "New Agent Inventory via capability" << llendl;
- LLSD body;
- body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type);
- body["asset_type"] = LLAssetType::lookup(asset_type);
- body["inventory_type"] = LLInventoryType::lookup(inv_type);
- body["name"] = name;
- body["description"] = desc;
- body["next_owner_mask"] = LLSD::Integer(next_owner_perms);
- body["group_mask"] = LLSD::Integer(group_perms);
- body["everyone_mask"] = LLSD::Integer(everyone_perms);
- body["expected_upload_cost"] = LLSD::Integer(expected_upload_cost);
-
- //std::ostringstream llsdxml;
- //LLSDSerialize::toPrettyXML(body, llsdxml);
- //llinfos << "posting body to capability: " << llsdxml.str() << llendl;
- LLHTTPClient::post(url, body, new LLNewAgentInventoryResponder(body, uuid, asset_type));
+ LLSD body;
+ body = generate_new_resource_upload_capability_body(
+ asset_type,
+ name,
+ desc,
+ destination_folder_type,
+ inv_type,
+ next_owner_perms,
+ group_perms,
+ everyone_perms);
+
+ LLHTTPClient::post(
+ url,
+ body,
+ new LLNewAgentInventoryResponder(
+ body,
+ uuid,
+ asset_type));
}
else
{
@@ -1020,18 +1122,158 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty
{
asset_callback = callback;
}
- gAssetStorage->storeAssetData(data->mAssetInfo.mTransactionID, data->mAssetInfo.mType,
- asset_callback,
- (void*)data,
- FALSE);
+ gAssetStorage->storeAssetData(
+ data->mAssetInfo.mTransactionID,
+ data->mAssetInfo.mType,
+ asset_callback,
+ (void*)data,
+ FALSE);
+ }
+}
+
+BOOL upload_new_variable_price_resource(
+ const LLTransactionID &tid,
+ LLAssetType::EType asset_type,
+ std::string name,
+ std::string desc,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms,
+ const std::string& display_name,
+ const LLSD& asset_resources)
+{
+ LLAssetID uuid =
+ upload_new_resource_prep(
+ tid,
+ asset_type,
+ inv_type,
+ name,
+ display_name,
+ desc);
+
+ llinfos << "*** Uploading: " << llendl;
+ llinfos << "Type: " << LLAssetType::lookup(asset_type) << llendl;
+ llinfos << "UUID: " << uuid << llendl;
+ llinfos << "Name: " << name << llendl;
+ llinfos << "Desc: " << desc << llendl;
+ lldebugs << "Folder: "
+ << gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? (LLFolderType::EType)asset_type : destination_folder_type) << llendl;
+ lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl;
+
+ std::string url = gAgent.getRegion()->getCapability(
+ "NewFileAgentInventoryVariablePrice");
+
+ if ( !url.empty() )
+ {
+ lldebugs
+ << "New Agent Inventory variable price upload" << llendl;
+
+ // Each of the two capabilities has similar data, so
+ // let's reuse that code
+
+ LLSD body;
+
+ body = generate_new_resource_upload_capability_body(
+ asset_type,
+ name,
+ desc,
+ destination_folder_type,
+ inv_type,
+ next_owner_perms,
+ group_perms,
+ everyone_perms);
+
+ body["asset_resources"] = asset_resources;
+
+ LLHTTPClient::post(
+ url,
+ body,
+ new LLNewAgentInventoryVariablePriceResponder(
+ uuid,
+ asset_type,
+ body));
+
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
}
}
+LLAssetID generate_asset_id_for_new_upload(const LLTransactionID& tid)
+{
+ if ( gDisconnected )
+ {
+ LLAssetID rv;
+
+ rv.setNull();
+ return rv;
+ }
+
+ LLAssetID uuid = tid.makeAssetID(gAgent.getSecureSessionID());
+
+ return uuid;
+}
+
+void increase_new_upload_stats(LLAssetType::EType asset_type)
+{
+ if ( LLAssetType::AT_SOUND == asset_type )
+ {
+ LLViewerStats::getInstance()->incStat(
+ LLViewerStats::ST_UPLOAD_SOUND_COUNT );
+ }
+ else if ( LLAssetType::AT_TEXTURE == asset_type )
+ {
+ LLViewerStats::getInstance()->incStat(
+ LLViewerStats::ST_UPLOAD_TEXTURE_COUNT );
+ }
+ else if ( LLAssetType::AT_ANIMATION == asset_type )
+ {
+ LLViewerStats::getInstance()->incStat(
+ LLViewerStats::ST_UPLOAD_ANIM_COUNT );
+ }
+}
+
+void assign_defaults_and_show_upload_message(
+ LLAssetType::EType asset_type,
+ LLInventoryType::EType& inventory_type,
+ std::string& name,
+ const std::string& display_name,
+ std::string& description)
+{
+ if ( LLInventoryType::IT_NONE == inventory_type )
+ {
+ inventory_type = LLInventoryType::defaultForAssetType(asset_type);
+ }
+ LLStringUtil::stripNonprintable(name);
+ LLStringUtil::stripNonprintable(description);
+
+ if ( name.empty() )
+ {
+ name = "(No Name)";
+ }
+ if ( description.empty() )
+ {
+ description = "(No Description)";
+ }
+
+ // At this point, we're ready for the upload.
+ std::string upload_message = "Uploading...\n\n";
+ upload_message.append(display_name);
+ LLUploadDialog::modalUploadDialog(upload_message);
+}
+
+
void init_menu_file()
{
view_listener_t::addCommit(new LLFileUploadImage(), "File.UploadImage");
view_listener_t::addCommit(new LLFileUploadSound(), "File.UploadSound");
view_listener_t::addCommit(new LLFileUploadAnim(), "File.UploadAnim");
+ view_listener_t::addCommit(new LLFileUploadModel(), "File.UploadModel");
+ view_listener_t::addCommit(new LLFileUploadScene(), "File.UploadScene");
view_listener_t::addCommit(new LLFileUploadBulk(), "File.UploadBulk");
view_listener_t::addCommit(new LLFileCloseWindow(), "File.CloseWindow");
view_listener_t::addCommit(new LLFileCloseAllWindows(), "File.CloseAllWindows");
diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h
index 1e6d13f1c6..7167903311 100644
--- a/indra/newview/llviewermenufile.h
+++ b/indra/newview/llviewermenufile.h
@@ -42,33 +42,62 @@ class LLTransactionID;
void init_menu_file();
-void upload_new_resource(const std::string& src_filename,
- std::string name,
- std::string desc,
- S32 compression_info,
- LLFolderType::EType destination_folder_type,
- LLInventoryType::EType inv_type,
- U32 next_owner_perms,
- U32 group_perms,
- U32 everyone_perms,
- const std::string& display_name,
- LLAssetStorage::LLStoreAssetCallback callback,
- S32 expected_upload_cost,
- void *userdata);
+LLUUID upload_new_resource(
+ const std::string& src_filename,
+ std::string name,
+ std::string desc,
+ S32 compression_info,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms,
+ const std::string& display_name,
+ LLAssetStorage::LLStoreAssetCallback callback,
+ S32 expected_upload_cost,
+ void *userdata);
-void upload_new_resource(const LLTransactionID &tid,
- LLAssetType::EType type,
- std::string name,
- std::string desc,
- S32 compression_info,
- LLFolderType::EType destination_folder_type,
- LLInventoryType::EType inv_type,
- U32 next_owner_perms,
- U32 group_perms,
- U32 everyone_perms,
- const std::string& display_name,
- LLAssetStorage::LLStoreAssetCallback callback,
- S32 expected_upload_cost,
- void *userdata);
+void upload_new_resource(
+ const LLTransactionID &tid,
+ LLAssetType::EType type,
+ std::string name,
+ std::string desc,
+ S32 compression_info,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms,
+ const std::string& display_name,
+ LLAssetStorage::LLStoreAssetCallback callback,
+ S32 expected_upload_cost,
+ void *userdata);
+
+// TODO* : Move all uploads to use this new function
+// since at some point, that upload path will be deprecated and no longer
+// used
+
+// We make a new function here to ensure that previous code is not broken
+BOOL upload_new_variable_price_resource(
+ const LLTransactionID& tid,
+ LLAssetType::EType type,
+ std::string name,
+ std::string desc,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms,
+ const std::string& display_name,
+ const LLSD& asset_resources);
+
+LLAssetID generate_asset_id_for_new_upload(const LLTransactionID& tid);
+void increase_new_upload_stats(LLAssetType::EType asset_type);
+void assign_defaults_and_show_upload_message(
+ LLAssetType::EType asset_type,
+ LLInventoryType::EType& inventory_type,
+ std::string& name,
+ const std::string& display_name,
+ std::string& description);
#endif
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 143d95d27e..5338ae9346 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -38,6 +38,7 @@
#include "llavataractions.h"
#include "lscript_byteformat.h"
#include "lleconomy.h"
+#include "lleventtimer.h"
#include "llfloaterreg.h"
#include "llfollowcamparams.h"
#include "llregionhandle.h"
@@ -866,6 +867,10 @@ void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& f
}
LLInventoryItem* item = gInventory.getItem(item_id);
+ llassert(item);
+ if (!item) {
+ continue;
+ }
////////////////////////////////////////////////////////////////////////////////
// Special handling for various types.
@@ -914,12 +919,13 @@ void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& f
{
// Landmark creation handling is moved to LLPanelPlaces::showAddedLandmarkInfo()
// TODO* LLPanelPlaces dependency is going to be removed. See EXT-4347.
- if("create_landmark" == places_panel->getPlaceInfoType() && !places_panel->getItem())
- {
- //places_panel->setItem(item);
- }
+ //if("create_landmark" == places_panel->getPlaceInfoType() && !places_panel->getItem())
+ //{
+ // places_panel->setItem(item);
+ //}
+ //else
// we are opening a group notice attachment
- else
+ if("create_landmark" != places_panel->getPlaceInfoType())
{
LLSD args;
args["type"] = "landmark";
@@ -1261,10 +1267,6 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
gInventory.addObserver(opener);
}
- // Remove script dialog because there is no need in it no more.
- LLUUID object_id = notification["payload"]["object_id"].asUUID();
- LLScriptFloaterManager::instance().removeNotificationByObjectId(object_id);
-
delete this;
return false;
}
@@ -1304,13 +1306,6 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
msg->addUUIDFast(_PREHASH_RegionID, LLUUID::null);
msg->addVector3Fast(_PREHASH_Position, gAgent.getPositionAgent());
LLInventoryObserver* opener = NULL;
- LLViewerInventoryCategory* catp = NULL;
- catp = (LLViewerInventoryCategory*)gInventory.getCategory(mObjectID);
- LLViewerInventoryItem* itemp = NULL;
- if(!catp)
- {
- itemp = (LLViewerInventoryItem*)gInventory.getItem(mObjectID);
- }
std::string from_string; // Used in the pop-up.
std::string chatHistory_string; // Used in chat history.
@@ -1438,10 +1433,6 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
gInventory.addObserver(opener);
}
- // Remove script dialog because there is no need in it no more.
- LLUUID object_id = notification["payload"]["object_id"].asUUID();
- LLScriptFloaterManager::instance().removeNotificationByObjectId(object_id);
-
delete this;
return false;
}
@@ -1592,7 +1583,6 @@ void inventory_offer_handler(LLOfferInfo* info)
{
payload["give_inventory_notification"] = TRUE;
LLNotificationPtr notification = LLNotifications::instance().add(p.payload(payload));
- LLScriptFloaterManager::getInstance()->setNotificationToastId(object_id, notification->getID());
}
}
}
@@ -1849,6 +1839,11 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
}
else
{
+ /*
+ EXT-5099
+ currently there is no way to store in history only...
+ using LLNotificationsUtil::add will add message to Nearby Chat
+
// muted user, so don't start an IM session, just record line in chat
// history. Pretend the chat is from a local agent,
// so it will go into the history but not be shown on screen.
@@ -1856,6 +1851,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
LLSD args;
args["MESSAGE"] = buffer;
LLNotificationsUtil::add("SystemMessageTip", args);
+ */
}
}
break;
@@ -3262,6 +3258,7 @@ const F32 THRESHOLD_HEAD_ROT_QDOT = 0.9997f; // ~= 2.5 degrees -- if its less th
const F32 MAX_HEAD_ROT_QDOT = 0.99999f; // ~= 0.5 degrees -- if its greater than this then no need to update head_rot
// between these values we delay the updates (but no more than one second)
+static LLFastTimer::DeclareTimer FTM_AGENT_UPDATE_SEND("Send Message");
void send_agent_update(BOOL force_send, BOOL send_reliable)
{
@@ -3420,6 +3417,7 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)
if (duplicate_count < DUP_MSGS && !gDisconnected)
{
+ LLFastTimer t(FTM_AGENT_UPDATE_SEND);
// Build the message
msg->newMessageFast(_PREHASH_AgentUpdate);
msg->nextBlockFast(_PREHASH_AgentData);
@@ -4832,6 +4830,7 @@ void process_economy_data(LLMessageSystem *msg, void** /*user_data*/)
gMenuHolder->childSetLabelArg("Upload Image", "[COST]", llformat("%d", upload_cost));
gMenuHolder->childSetLabelArg("Upload Sound", "[COST]", llformat("%d", upload_cost));
+ gMenuHolder->childSetLabelArg("Upload Model", "[COST]", llformat("%d", upload_cost));
gMenuHolder->childSetLabelArg("Upload Animation", "[COST]", llformat("%d", upload_cost));
gMenuHolder->childSetLabelArg("Bulk Upload", "[COST]", llformat("%d", upload_cost));
}
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 4fdfc37d6c..b5642d07a5 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -4022,9 +4022,14 @@ LLBBox LLViewerObject::getBoundingBoxAgent() const
{
LLVector3 position_agent;
LLQuaternion rot;
+ LLViewerObject* avatar_parent = NULL;
LLViewerObject* root_edit = (LLViewerObject*)getRootEdit();
- LLViewerObject* avatar_parent = (LLViewerObject*)root_edit->getParent();
- if (avatar_parent && avatar_parent->isAvatar() && root_edit->mDrawable.notNull())
+ if (root_edit)
+ {
+ avatar_parent = (LLViewerObject*)root_edit->getParent();
+ }
+
+ if (avatar_parent && avatar_parent->isAvatar() && root_edit && root_edit->mDrawable.notNull())
{
LLXform* parent_xform = root_edit->mDrawable->getXform()->getParent();
position_agent = (getPositionEdit() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition();
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index 6347090f71..7f147836a1 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -871,8 +871,12 @@ void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
mNumDeadObjects++;
}
+static LLFastTimer::DeclareTimer FTM_REMOVE_DRAWABLE("Remove Drawable");
+
void LLViewerObjectList::removeDrawable(LLDrawable* drawablep)
{
+ LLFastTimer t(FTM_REMOVE_DRAWABLE);
+
if (!drawablep)
{
return;
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h
index 8d3d2c4b44..706966deae 100644
--- a/indra/newview/llviewerobjectlist.h
+++ b/indra/newview/llviewerobjectlist.h
@@ -232,6 +232,10 @@ public:
extern LLViewerObjectList gObjectList;
// Inlines
+/**
+ * Note:
+ * it will return NULL for offline avatar_id
+ */
inline LLViewerObject *LLViewerObjectList::findObject(const LLUUID &id)
{
std::map<LLUUID, LLPointer<LLViewerObject> >::iterator iter = mUUIDObjectMap.find(id);
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index c4fc2e5cab..2c5c0a37e8 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -105,15 +105,6 @@ void LLViewerParcelMedia::update(LLParcel* parcel)
std::string mediaUrl = std::string ( parcel->getMediaURL () );
std::string mediaCurrentUrl = std::string( parcel->getMediaCurrentURL());
- // First use warning
- if( (!mediaUrl.empty() ||
- !parcel->getMusicURL().empty())
- && LLViewerMedia::needsMediaFirstRun())
- {
- LLViewerMedia::displayMediaFirstRun();
- return;
- }
-
// if we have a current (link sharing) url, use it instead
if (mediaCurrentUrl != "" && parcel->getMediaType() == "text/html")
{
diff --git a/indra/newview/llviewerparcelmediaautoplay.h b/indra/newview/llviewerparcelmediaautoplay.h
index 1d80b4756c..40142c1dd1 100644
--- a/indra/newview/llviewerparcelmediaautoplay.h
+++ b/indra/newview/llviewerparcelmediaautoplay.h
@@ -33,7 +33,7 @@
#ifndef LLVIEWERPARCELMEDIAAUTOPLAY_H
#define LLVIEWERPARCELMEDIAAUTOPLAY_H
-#include "lltimer.h"
+#include "lleventtimer.h"
#include "lluuid.h"
// timer to automatically play media
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index a075a706e1..07c8867e26 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -1762,6 +1762,12 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
{
optionally_start_music(music_url);
}
+ else
+ {
+ llinfos << "Stopping parcel music (invalid audio stream URL)" << llendl;
+ // clears the URL
+ gAudiop->startInternetStream(LLStringUtil::null);
+ }
}
else if (!gAudiop->getInternetStreamURL().empty())
{
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 77d2d493bd..847e70adac 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -1434,12 +1434,15 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
capabilityNames.append("FetchLib");
capabilityNames.append("FetchLibDescendents");
capabilityNames.append("GetTexture");
+ capabilityNames.append("GetMesh");
capabilityNames.append("GroupProposalBallot");
capabilityNames.append("HomeLocation");
capabilityNames.append("LandResources");
capabilityNames.append("MapLayer");
capabilityNames.append("MapLayerGod");
capabilityNames.append("NewFileAgentInventory");
+ capabilityNames.append("NewFileAgentInventoryVariablePrice");
+ capabilityNames.append("ObjectAdd");
capabilityNames.append("ParcelPropertiesUpdate");
capabilityNames.append("ParcelMediaURLFilterList");
capabilityNames.append("ParcelNavigateMedia");
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index ea8af223c3..7f5680b6df 100644
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -532,6 +532,7 @@ LLUIImagePtr LLEmbeddedItems::getItemImage(llwchar ext_char) const
case LLAssetType::AT_BODYPART: img_name = "Inv_Skin"; break;
case LLAssetType::AT_ANIMATION: img_name = "Inv_Animation"; break;
case LLAssetType::AT_GESTURE: img_name = "Inv_Gesture"; break;
+ case LLAssetType::AT_MESH: img_name = "Inv_Mesh"; break;
default: llassert(0);
}
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 0ad269392d..768b145351 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -496,7 +496,9 @@ void LLViewerTexture::init(bool firstinit)
mAdditionalDecodePriority = 0.f ;
mParcelMedia = NULL ;
mNumFaces = 0 ;
+ mNumVolumes = 0;
mFaceList.clear() ;
+ mVolumeList.clear();
}
//virtual
@@ -508,7 +510,7 @@ S8 LLViewerTexture::getType() const
void LLViewerTexture::cleanup()
{
mFaceList.clear() ;
-
+ mVolumeList.clear();
if(mGLTexturep)
{
mGLTexturep->cleanup();
@@ -661,6 +663,42 @@ S32 LLViewerTexture::getNumFaces() const
return mNumFaces ;
}
+
+//virtual
+void LLViewerTexture::addVolume(LLVOVolume* volumep)
+{
+ if( mNumVolumes >= mVolumeList.size())
+ {
+ mVolumeList.resize(2 * mNumVolumes + 1) ;
+ }
+ mVolumeList[mNumVolumes] = volumep ;
+ volumep->setIndexInTex(mNumVolumes) ;
+ mNumVolumes++ ;
+ mLastVolumeListUpdateTimer.reset() ;
+}
+
+//virtual
+void LLViewerTexture::removeVolume(LLVOVolume* volumep)
+{
+ if(mNumVolumes > 1)
+ {
+ S32 index = volumep->getIndexInTex() ;
+ mVolumeList[index] = mVolumeList[--mNumVolumes] ;
+ mVolumeList[index]->setIndexInTex(index) ;
+ }
+ else
+ {
+ mVolumeList.clear() ;
+ mNumVolumes = 0 ;
+ }
+ mLastVolumeListUpdateTimer.reset() ;
+}
+
+S32 LLViewerTexture::getNumVolumes() const
+{
+ return mNumVolumes ;
+}
+
void LLViewerTexture::reorganizeFaceList()
{
static const F32 MAX_WAIT_TIME = 20.f; // seconds
@@ -680,6 +718,27 @@ void LLViewerTexture::reorganizeFaceList()
mFaceList.erase(mFaceList.begin() + mNumFaces, mFaceList.end());
}
+void LLViewerTexture::reorganizeVolumeList()
+{
+ static const F32 MAX_WAIT_TIME = 20.f; // seconds
+ static const U32 MAX_EXTRA_BUFFER_SIZE = 4 ;
+
+ if(mNumVolumes + MAX_EXTRA_BUFFER_SIZE > mVolumeList.size())
+ {
+ return ;
+ }
+
+ if(mLastVolumeListUpdateTimer.getElapsedTimeF32() < MAX_WAIT_TIME)
+ {
+ return ;
+ }
+
+ mLastVolumeListUpdateTimer.reset() ;
+ mVolumeList.erase(mVolumeList.begin() + mNumVolumes, mVolumeList.end());
+}
+
+
+
//virtual
void LLViewerTexture::switchToCachedImage()
{
@@ -715,7 +774,7 @@ void LLViewerTexture::generateGLTexture()
LLImageGL* LLViewerTexture::getGLTexture() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep ;
}
@@ -732,10 +791,10 @@ BOOL LLViewerTexture::createGLTexture()
BOOL LLViewerTexture::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename, BOOL to_create, S32 category)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
BOOL ret = mGLTexturep->createGLTexture(discard_level, imageraw, usename, to_create, category) ;
-
+
if(ret)
{
mFullWidth = mGLTexturep->getCurrentWidth() ;
@@ -748,55 +807,55 @@ BOOL LLViewerTexture::createGLTexture(S32 discard_level, const LLImageRaw* image
void LLViewerTexture::setExplicitFormat(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format, BOOL swap_bytes)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
mGLTexturep->setExplicitFormat(internal_format, primary_format, type_format, swap_bytes) ;
}
void LLViewerTexture::setAddressMode(LLTexUnit::eTextureAddressMode mode)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
mGLTexturep->setAddressMode(mode) ;
}
void LLViewerTexture::setFilteringOption(LLTexUnit::eTextureFilterOptions option)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
mGLTexturep->setFilteringOption(option) ;
}
//virtual
S32 LLViewerTexture::getWidth(S32 discard_level) const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getWidth(discard_level) ;
}
//virtual
S32 LLViewerTexture::getHeight(S32 discard_level) const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getHeight(discard_level) ;
}
S32 LLViewerTexture::getMaxDiscardLevel() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getMaxDiscardLevel() ;
}
S32 LLViewerTexture::getDiscardLevel() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getDiscardLevel() ;
}
S8 LLViewerTexture::getComponents() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getComponents() ;
}
LLGLuint LLViewerTexture::getTexName() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getTexName() ;
}
@@ -821,124 +880,124 @@ BOOL LLViewerTexture::getBoundRecently() const
LLTexUnit::eTextureType LLViewerTexture::getTarget(void) const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getTarget() ;
}
BOOL LLViewerTexture::setSubImage(const LLImageRaw* imageraw, S32 x_pos, S32 y_pos, S32 width, S32 height)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->setSubImage(imageraw, x_pos, y_pos, width, height) ;
}
BOOL LLViewerTexture::setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->setSubImage(datap, data_width, data_height, x_pos, y_pos, width, height) ;
}
void LLViewerTexture::setGLTextureCreated (bool initialized)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
mGLTexturep->setGLTextureCreated (initialized) ;
}
void LLViewerTexture::setCategory(S32 category)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
mGLTexturep->setCategory(category) ;
}
LLTexUnit::eTextureAddressMode LLViewerTexture::getAddressMode(void) const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getAddressMode() ;
}
S32 LLViewerTexture::getTextureMemory() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->mTextureMemory ;
}
LLGLenum LLViewerTexture::getPrimaryFormat() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getPrimaryFormat() ;
}
BOOL LLViewerTexture::getIsAlphaMask() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getIsAlphaMask() ;
}
BOOL LLViewerTexture::getMask(const LLVector2 &tc)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getMask(tc) ;
}
F32 LLViewerTexture::getTimePassedSinceLastBound()
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getTimePassedSinceLastBound() ;
}
BOOL LLViewerTexture::getMissed() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getMissed() ;
}
BOOL LLViewerTexture::isJustBound() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->isJustBound() ;
}
void LLViewerTexture::forceUpdateBindStats(void) const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->forceUpdateBindStats() ;
}
U32 LLViewerTexture::getTexelsInAtlas() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getTexelsInAtlas() ;
}
U32 LLViewerTexture::getTexelsInGLTexture() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getTexelsInGLTexture() ;
}
BOOL LLViewerTexture::isGLTextureCreated() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->isGLTextureCreated() ;
}
S32 LLViewerTexture::getDiscardLevelInAtlas() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getDiscardLevelInAtlas() ;
}
@@ -974,12 +1033,6 @@ void LLViewerTexture::updateBindStatsForTester()
//start of LLViewerFetchedTexture
//----------------------------------------------------------------------------------------------
-//static
-F32 LLViewerFetchedTexture::maxDecodePriority()
-{
- return 6000000.f;
-}
-
LLViewerFetchedTexture::LLViewerFetchedTexture(const LLUUID& id, const LLHost& host, BOOL usemipmaps)
: LLViewerTexture(id, usemipmaps),
mTargetHost(host)
@@ -1426,6 +1479,13 @@ void LLViewerFetchedTexture::processTextureStats()
}
}
+const F32 MAX_PRIORITY_PIXEL = 999.f ; //pixel area
+const F32 PRIORITY_BOOST_LEVEL_FACTOR = 1000.f ; //boost level
+const F32 PRIORITY_DELTA_DISCARD_LEVEL_FACTOR = 100000.f ; //delta discard
+const S32 MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY = 4 ;
+const F32 PRIORITY_ADDITIONAL_FACTOR = 1000000.f ; //additional
+const S32 MAX_ADDITIONAL_LEVEL_FOR_PRIORITY = 8 ;
+const F32 PRIORITY_BOOST_HIGH_FACTOR = 10000000.f ;//boost high
F32 LLViewerFetchedTexture::calcDecodePriority()
{
#ifndef LL_RELEASE_FOR_DOWNLOAD
@@ -1453,7 +1513,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
bool have_all_data = (cur_discard >= 0 && (cur_discard <= mDesiredDiscardLevel));
F32 pixel_priority = fsqrtf(mMaxVirtualSize);
- F32 priority;
+ F32 priority = 0.f;
if (mIsMissingAsset)
{
priority = 0.0f;
@@ -1496,8 +1556,8 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
static const F64 log_2 = log(2.0);
F32 desired = (F32)(log(32.0/pixel_priority) / log_2);
S32 ddiscard = MAX_DISCARD_LEVEL - (S32)desired;
- ddiscard = llclamp(ddiscard, 0, 4);
- priority = (ddiscard+1)*100000.f;
+ ddiscard = llclamp(ddiscard, 0, MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY);
+ priority = (ddiscard + 1) * PRIORITY_DELTA_DISCARD_LEVEL_FACTOR;
}
else if ((mMinDiscardLevel > 0) && (cur_discard <= mMinDiscardLevel))
{
@@ -1518,47 +1578,58 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
}
else if (!isJustBound() && mCachedRawImageReady)
{
- if(mBoostLevel < BOOST_HIGH)
- {
- // We haven't rendered this in a while, de-prioritize it
- desired_discard += 2;
- }
- //else
+ //if(mBoostLevel < BOOST_HIGH)
//{
- // // We haven't rendered this in the last half second, and we have a cached raw image, leave the desired discard as-is
- // desired_discard = cur_discard;
+ // // We haven't rendered this in a while, de-prioritize it
+ // desired_discard += 2;
//}
+ //else
+ {
+ // We haven't rendered this in the last half second, and we have a cached raw image, leave the desired discard as-is
+ desired_discard = cur_discard;
+ }
}
S32 ddiscard = cur_discard - desired_discard;
- ddiscard = llclamp(ddiscard, 0, 4);
- priority = (ddiscard+1)*100000.f;
+ ddiscard = llclamp(ddiscard, 0, MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY);
+ priority = (ddiscard + 1) * PRIORITY_DELTA_DISCARD_LEVEL_FACTOR;
}
// Priority Formula:
// BOOST_HIGH + ADDITIONAL PRI + DELTA DISCARD + BOOST LEVEL + PIXELS
- // [10,000,000] + [1-9,000,000] + [1-400,000] + [1-20,000] + [0-999]
+ // [10,000,000] + [1,000,000-9,000,000] + [100,000-500,000] + [1-20,000] + [0-999]
if (priority > 0.0f)
{
- pixel_priority = llclamp(pixel_priority, 0.0f, 999.f);
+ pixel_priority = llclamp(pixel_priority, 0.0f, MAX_PRIORITY_PIXEL);
- priority = pixel_priority + 1000.f * mBoostLevel;
+ priority += pixel_priority + PRIORITY_BOOST_LEVEL_FACTOR * mBoostLevel;
if ( mBoostLevel > BOOST_HIGH)
{
- priority += 10000000.f;
+ priority += PRIORITY_BOOST_HIGH_FACTOR;
}
if(mAdditionalDecodePriority > 0.0f)
{
- // 1-9
- S32 additional_priority = (S32)(1.0f + mAdditionalDecodePriority*8.0f + .5f); // round
- // priority range += 0-9,000,000
- priority += 1000000.f * (F32)additional_priority;
+ // priority range += 1,000,000.f-9,000,000.f
+ priority += PRIORITY_ADDITIONAL_FACTOR * (1.0 + mAdditionalDecodePriority * MAX_ADDITIONAL_LEVEL_FOR_PRIORITY);
}
}
return priority;
}
+
+//static
+F32 LLViewerFetchedTexture::maxDecodePriority()
+{
+ static const F32 max_priority = PRIORITY_BOOST_HIGH_FACTOR + //boost_high
+ PRIORITY_ADDITIONAL_FACTOR * (MAX_ADDITIONAL_LEVEL_FOR_PRIORITY + 1) + //additional (view dependent factors)
+ PRIORITY_DELTA_DISCARD_LEVEL_FACTOR * (MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY + 1) + //delta discard
+ PRIORITY_BOOST_LEVEL_FACTOR * (BOOST_MAX_LEVEL - 1) + //boost level
+ MAX_PRIORITY_PIXEL + 1.0f ; //pixel area.
+
+ return max_priority ;
+}
+
//============================================================================
void LLViewerFetchedTexture::setDecodePriority(F32 priority)
@@ -1598,6 +1669,7 @@ void LLViewerFetchedTexture::updateVirtualSize()
}
mNeedsResetMaxVirtualSize = TRUE ;
reorganizeFaceList() ;
+ reorganizeVolumeList();
}
bool LLViewerFetchedTexture::updateFetch()
@@ -2238,13 +2310,13 @@ void LLViewerFetchedTexture::destroyRawImage()
if (mRawImage.notNull())
{
- sRawCount--;
- setCachedRawImage() ;
+ sRawCount--;
if(mForceToSaveRawImage)
{
saveRawImage() ;
}
+ setCachedRawImage() ;
}
mRawImage = NULL;
@@ -2330,17 +2402,12 @@ void LLViewerFetchedTexture::setCachedRawImage()
{
--i ;
}
- //if(mForSculpt)
- //{
- // mRawImage->scaleDownWithoutBlending(w >> i, h >> i) ;
- //}
- //else
- {
- mRawImage->scale(w >> i, h >> i) ;
- }
+
+ mRawImage->scale(w >> i, h >> i) ;
}
mCachedRawImage = mRawImage ;
- mCachedRawDiscardLevel = mRawDiscardLevel + i ;
+ mRawDiscardLevel += i ;
+ mCachedRawDiscardLevel = mRawDiscardLevel ;
}
}
@@ -2410,7 +2477,7 @@ BOOL LLViewerFetchedTexture::hasSavedRawImage() const
F32 LLViewerFetchedTexture::getElapsedLastReferencedSavedRawImageTime() const
{
- return mLastReferencedSavedRawImageTime - sCurrentTime ;
+ return sCurrentTime - mLastReferencedSavedRawImageTime ;
}
//----------------------------------------------------------------------------------------------
//atlasing
@@ -2545,7 +2612,7 @@ BOOL LLViewerFetchedTexture::insertToAtlas()
}
//process the waiting_list
- for(ll_face_list_t::iterator iter = waiting_list.begin(); iter != waiting_list.end(); ++iter)
+ for(std::vector<LLFace*>::iterator iter = waiting_list.begin(); iter != waiting_list.end(); ++iter)
{
facep = (LLFace*)*iter ;
groupp = facep->getDrawable()->getSpatialGroup() ;
@@ -2687,7 +2754,7 @@ void LLViewerLODTexture::processTextureStats()
}
else
{
- if(isLargeImage() && !isJustBound() && mAdditionalDecodePriority < 1.0f)
+ if(isLargeImage() && !isJustBound() && mAdditionalDecodePriority < 0.3f)
{
//if is a big image and not being used recently, nor close to the view point, do not load hi-res data.
mMaxVirtualSize = llmin(mMaxVirtualSize, (F32)LLViewerTexture::sMinLargeImageSize) ;
@@ -2873,12 +2940,11 @@ LLViewerMediaTexture::~LLViewerMediaTexture()
void LLViewerMediaTexture::reinit(BOOL usemipmaps /* = TRUE */)
{
- mGLTexturep = NULL ;
- init(false);
+ llassert(mGLTexturep.notNull()) ;
+
mUseMipMaps = usemipmaps ;
getLastReferencedTimer()->reset() ;
-
- generateGLTexture() ;
+ mGLTexturep->setUseMipMaps(mUseMipMaps) ;
mGLTexturep->setNeedsAlphaAndPickMask(FALSE) ;
}
@@ -2983,6 +3049,10 @@ void LLViewerMediaTexture::initVirtualSize()
void LLViewerMediaTexture::addMediaToFace(LLFace* facep)
{
+ if(facep)
+ {
+ facep->setHasMedia(true) ;
+ }
if(!mIsPlaying)
{
return ; //no need to add the face because the media is not in playing.
@@ -2993,14 +3063,16 @@ void LLViewerMediaTexture::addMediaToFace(LLFace* facep)
void LLViewerMediaTexture::removeMediaFromFace(LLFace* facep)
{
- if(!mIsPlaying)
- {
- return ; //no need to remove the face because the media is not in playing.
- }
if(!facep)
{
return ;
}
+ facep->setHasMedia(false) ;
+
+ if(!mIsPlaying)
+ {
+ return ; //no need to remove the face because the media is not in playing.
+ }
mIsPlaying = FALSE ; //set to remove the media from the face.
switchTexture(facep) ;
@@ -3252,6 +3324,7 @@ F32 LLViewerMediaTexture::getMaxVirtualSize()
mNeedsResetMaxVirtualSize = TRUE ;
reorganizeFaceList() ;
+ reorganizeVolumeList();
return mMaxVirtualSize ;
}
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index 79d9c4e7bb..85f03b5839 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -134,7 +134,9 @@ public:
static S32 getIndexFromCategory(S32 category) ;
static S32 getCategoryFromIndex(S32 index) ;
- typedef std::vector<LLFace*> ll_face_list_t ;
+ typedef std::vector<LLFace*> ll_face_list_t;
+ typedef std::vector<LLVOVolume*> ll_volume_list_t;
+
protected:
virtual ~LLViewerTexture();
@@ -178,6 +180,11 @@ public:
S32 getNumFaces() const;
const ll_face_list_t* getFaceList() const {return &mFaceList;}
+ virtual void addVolume(LLVOVolume* volumep);
+ virtual void removeVolume(LLVOVolume* volumep);
+ S32 getNumVolumes() const;
+ const ll_volume_list_t* getVolumeList() const { return &mVolumeList; }
+
void generateGLTexture() ;
void destroyGLTexture() ;
@@ -242,7 +249,7 @@ protected:
void cleanup() ;
void init(bool firstinit) ;
void reorganizeFaceList() ;
-
+ void reorganizeVolumeList() ;
private:
//note: do not make this function public.
/*virtual*/ LLImageGL* getGLTexture() const ;
@@ -269,6 +276,10 @@ protected:
U32 mNumFaces ;
LLFrameTimer mLastFaceListUpdateTimer ;
+ ll_volume_list_t mVolumeList;
+ U32 mNumVolumes;
+ LLFrameTimer mLastVolumeListUpdateTimer;
+
//do not use LLPointer here.
LLViewerMediaTexture* mParcelMedia ;
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 3e1306ae3c..333452a50d 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -856,56 +856,71 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi
LLVOVolume *obj = dynamic_cast<LLVOVolume*>(static_cast<LLViewerObject*>(pick_info.getObject()));
- if (obj && obj->permModify() && !obj->getRegion()->getCapability("ObjectMedia").empty())
+ if (obj && !obj->getRegion()->getCapability("ObjectMedia").empty())
{
LLTextureEntry *te = obj->getTE(object_face);
if (te)
{
if (drop)
{
- if (! te->hasMedia())
+ // object does NOT have media already
+ if ( ! te->hasMedia() )
{
- // Create new media entry
- LLSD media_data;
- // XXX Should we really do Home URL too?
- media_data[LLMediaEntry::HOME_URL_KEY] = url;
- media_data[LLMediaEntry::CURRENT_URL_KEY] = url;
- media_data[LLMediaEntry::AUTO_PLAY_KEY] = true;
- obj->syncMediaData(object_face, media_data, true, true);
- // XXX This shouldn't be necessary, should it ?!?
- if (obj->getMediaImpl(object_face))
- obj->getMediaImpl(object_face)->navigateReload();
- obj->sendMediaDataUpdate();
-
- result = LLWindowCallbacks::DND_COPY;
- }
- else {
- // Check the whitelist
- if (te->getMediaData()->checkCandidateUrl(url))
+ // we are allowed to modify the object
+ if ( obj->permModify() )
{
- // just navigate to the URL
+ // Create new media entry
+ LLSD media_data;
+ // XXX Should we really do Home URL too?
+ media_data[LLMediaEntry::HOME_URL_KEY] = url;
+ media_data[LLMediaEntry::CURRENT_URL_KEY] = url;
+ media_data[LLMediaEntry::AUTO_PLAY_KEY] = true;
+ obj->syncMediaData(object_face, media_data, true, true);
+ // XXX This shouldn't be necessary, should it ?!?
if (obj->getMediaImpl(object_face))
+ obj->getMediaImpl(object_face)->navigateReload();
+ obj->sendMediaDataUpdate();
+
+ result = LLWindowCallbacks::DND_COPY;
+ }
+ }
+ else
+ // object HAS media already
+ {
+ // URL passes the whitelist
+ if (te->getMediaData()->checkCandidateUrl( url ) )
+ {
+ // we are allowed to modify the object or we have navigate permissions
+ // NOTE: Design states you you can change the URL if you have media
+ // navigate permissions even if you do not have prim modify rights
+ if ( obj->permModify() || obj->hasMediaPermission( te->getMediaData(), LLVOVolume::MEDIA_PERM_INTERACT ) )
{
- obj->getMediaImpl(object_face)->navigateTo(url);
+ // just navigate to the URL
+ if (obj->getMediaImpl(object_face))
+ {
+ obj->getMediaImpl(object_face)->navigateTo(url);
+ }
+ else
+ {
+ // This is very strange. Navigation should
+ // happen via the Impl, but we don't have one.
+ // This sends it to the server, which /should/
+ // trigger us getting it. Hopefully.
+ LLSD media_data;
+ media_data[LLMediaEntry::CURRENT_URL_KEY] = url;
+ obj->syncMediaData(object_face, media_data, true, true);
+ obj->sendMediaDataUpdate();
+ }
+ result = LLWindowCallbacks::DND_LINK;
}
- else {
- // This is very strange. Navigation should
- // happen via the Impl, but we don't have one.
- // This sends it to the server, which /should/
- // trigger us getting it. Hopefully.
- LLSD media_data;
- media_data[LLMediaEntry::CURRENT_URL_KEY] = url;
- obj->syncMediaData(object_face, media_data, true, true);
- obj->sendMediaDataUpdate();
- }
- result = LLWindowCallbacks::DND_LINK;
}
}
LLSelectMgr::getInstance()->unhighlightObjectOnly(mDragHoveredObject);
mDragHoveredObject = NULL;
}
- else {
+ else
+ {
// Check the whitelist, if there's media (otherwise just show it)
if (te->getMediaData() == NULL || te->getMediaData()->checkCandidateUrl(url))
{
@@ -1730,7 +1745,11 @@ void LLViewerWindow::shutdownViews()
// destroy the nav bar, not currently part of gViewerWindow
// *TODO: Make LLNavigationBar part of gViewerWindow
delete LLNavigationBar::getInstance();
-
+
+ // destroy menus after instantiating navbar above, as it needs
+ // access to gMenuHolder
+ cleanup_menus();
+
// Delete all child views.
delete mRootView;
mRootView = NULL;
@@ -2472,6 +2491,8 @@ void LLViewerWindow::updateUI()
static std::string last_handle_msg;
+ LLConsole::updateClass();
+
// animate layout stacks so we have up to date rect for world view
LLLayoutStack::updateClass();
@@ -3820,140 +3841,6 @@ void LLViewerWindow::playSnapshotAnimAndSound()
BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, BOOL show_ui, BOOL do_rebuild, ESnapshotType type)
{
return rawSnapshot(raw, preview_width, preview_height, FALSE, FALSE, show_ui, do_rebuild, type);
-
- // *TODO below code was broken in deferred pipeline
- /*
- if ((!raw) || preview_width < 10 || preview_height < 10)
- {
- return FALSE;
- }
-
- if(gResizeScreenTexture) //the window is resizing
- {
- return FALSE ;
- }
-
- setCursor(UI_CURSOR_WAIT);
-
- // Hide all the UI widgets first and draw a frame
- BOOL prev_draw_ui = gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI);
-
- if ( prev_draw_ui != show_ui)
- {
- LLPipeline::toggleRenderDebugFeature((void*)LLPipeline::RENDER_DEBUG_FEATURE_UI);
- }
-
- BOOL hide_hud = !gSavedSettings.getBOOL("RenderHUDInSnapshot") && LLPipeline::sShowHUDAttachments;
- if (hide_hud)
- {
- LLPipeline::sShowHUDAttachments = FALSE;
- }
-
- S32 render_name = gSavedSettings.getS32("RenderName");
- gSavedSettings.setS32("RenderName", 0);
- LLVOAvatar::updateFreezeCounter(1) ; //pause avatar updating for one frame
-
- S32 w = preview_width ;
- S32 h = preview_height ;
- LLVector2 display_scale = mDisplayScale ;
- mDisplayScale.setVec((F32)w / mWindowRectRaw.getWidth(), (F32)h / mWindowRectRaw.getHeight()) ;
- LLRect window_rect = mWindowRectRaw;
- mWindowRectRaw.set(0, h, w, 0);
-
- gDisplaySwapBuffers = FALSE;
- gDepthDirty = TRUE;
- glClearColor(0.f, 0.f, 0.f, 0.f);
- glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
- setup3DRender();
-
- LLFontGL::setFontDisplay(FALSE) ;
- LLHUDText::setDisplayText(FALSE) ;
- if (type == SNAPSHOT_TYPE_OBJECT_ID)
- {
- gObjectList.renderPickList(gViewerWindow->getWindowRectScaled(), FALSE, FALSE);
- }
- else
- {
- display(do_rebuild, 1.0f, 0, TRUE);
- render_ui();
- }
-
- S32 glformat, gltype, glpixel_length ;
- if(SNAPSHOT_TYPE_DEPTH == type)
- {
- glpixel_length = 4 ;
- glformat = GL_DEPTH_COMPONENT ;
- gltype = GL_FLOAT ;
- }
- else
- {
- glpixel_length = 3 ;
- glformat = GL_RGB ;
- gltype = GL_UNSIGNED_BYTE ;
- }
-
- raw->resize(w, h, glpixel_length);
- glReadPixels(0, 0, w, h, glformat, gltype, raw->getData());
-
- if(SNAPSHOT_TYPE_DEPTH == type)
- {
- LLViewerCamera* camerap = LLViewerCamera::getInstance();
- F32 depth_conversion_factor_1 = (camerap->getFar() + camerap->getNear()) / (2.f * camerap->getFar() * camerap->getNear());
- F32 depth_conversion_factor_2 = (camerap->getFar() - camerap->getNear()) / (2.f * camerap->getFar() * camerap->getNear());
-
- //calculate the depth
- for (S32 y = 0 ; y < h ; y++)
- {
- for(S32 x = 0 ; x < w ; x++)
- {
- S32 i = (w * y + x) << 2 ;
-
- F32 depth_float_i = *(F32*)(raw->getData() + i);
-
- F32 linear_depth_float = 1.f / (depth_conversion_factor_1 - (depth_float_i * depth_conversion_factor_2));
- U8 depth_byte = F32_to_U8(linear_depth_float, camerap->getNear(), camerap->getFar());
- *(raw->getData() + i + 0) = depth_byte;
- *(raw->getData() + i + 1) = depth_byte;
- *(raw->getData() + i + 2) = depth_byte;
- *(raw->getData() + i + 3) = 255;
- }
- }
- }
-
- LLFontGL::setFontDisplay(TRUE) ;
- LLHUDText::setDisplayText(TRUE) ;
- mDisplayScale.setVec(display_scale) ;
- mWindowRectRaw = window_rect;
- setup3DRender();
- gDisplaySwapBuffers = FALSE;
- gDepthDirty = TRUE;
-
- // POST SNAPSHOT
- if (!gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
- {
- LLPipeline::toggleRenderDebugFeature((void*)LLPipeline::RENDER_DEBUG_FEATURE_UI);
- }
-
- if (hide_hud)
- {
- LLPipeline::sShowHUDAttachments = TRUE;
- }
-
- setCursor(UI_CURSOR_ARROW);
-
- if (do_rebuild)
- {
- // If we had to do a rebuild, that means that the lists of drawables to be rendered
- // was empty before we started.
- // Need to reset these, otherwise we call state sort on it again when render gets called the next time
- // and we stand a good chance of crashing on rebuild because the render drawable arrays have multiple copies of
- // objects on them.
- gPipeline.resetDrawOrders();
- }
-
- gSavedSettings.setS32("RenderName", render_name);
-
- return TRUE;*/
}
// Saves the image from the screen to the specified filename and path.
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 4235f97eab..7a6a48d1b3 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -1492,9 +1492,9 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename)
//-------------------------------------------------------------------------
// parse the file
//-------------------------------------------------------------------------
- BOOL success = sSkeletonXMLTree.parseFile( filename, FALSE );
+ BOOL parsesuccess = sSkeletonXMLTree.parseFile( filename, FALSE );
- if (!success)
+ if (!parsesuccess)
{
llerrs << "Can't parse skeleton file: " << filename << llendl;
return FALSE;
@@ -1505,11 +1505,13 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename)
if (!root)
{
llerrs << "No root node found in avatar skeleton file: " << filename << llendl;
+ return FALSE;
}
if( !root->hasName( "linden_skeleton" ) )
{
llerrs << "Invalid avatar skeleton file header: " << filename << llendl;
+ return FALSE;
}
std::string version;
@@ -1517,6 +1519,7 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename)
if( !root->getFastAttributeString( version_string, version ) || (version != "1.0") )
{
llerrs << "Invalid avatar skeleton file version: " << version << " in file: " << filename << llendl;
+ return FALSE;
}
return TRUE;
@@ -2192,13 +2195,16 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
// store off last frame's root position to be consistent with camera position
LLVector3 root_pos_last = mRoot.getWorldPosition();
BOOL detailed_update = updateCharacter(agent);
- BOOL voice_enabled = gVoiceClient->getVoiceEnabled( mID ) && gVoiceClient->inProximalChannel();
if (gNoRender)
{
return TRUE;
}
+ static LLUICachedControl<bool> visualizers_in_calls("ShowVoiceVisualizersInCalls", false);
+ bool voice_enabled = (visualizers_in_calls || gVoiceClient->inProximalChannel()) &&
+ gVoiceClient->getVoiceEnabled(mID);
+
idleUpdateVoiceVisualizer( voice_enabled );
idleUpdateMisc( detailed_update );
idleUpdateAppearanceAnimation();
@@ -2532,6 +2538,17 @@ void LLVOAvatar::idleUpdateLoadingEffect()
// update visibility when avatar is partially loaded
if (updateIsFullyLoaded()) // changed?
{
+ if (isFullyLoaded() && isSelf())
+ {
+ llinfos << "self isFullyLoaded" << llendl;
+
+ static bool first_fully_visible = true;
+ if (first_fully_visible)
+ {
+ first_fully_visible = false;
+ LLAppearanceManager::instance().onFirstFullyVisible();
+ }
+ }
if (isFullyLoaded())
{
deleteParticleSource();
@@ -3079,7 +3096,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
if (!visible)
{
- //updateMotions(LLCharacter::HIDDEN_UPDATE);
+ updateMotions(LLCharacter::HIDDEN_UPDATE);
return FALSE;
}
@@ -4048,6 +4065,7 @@ void LLVOAvatar::updateTextures()
// Spam if this is a baked texture, not set to default image, without valid host info
if (isIndexBakedTexture((ETextureIndex)texture_index)
&& imagep->getID() != IMG_DEFAULT_AVATAR
+ && imagep->getID() != IMG_INVISIBLE
&& !imagep->getTargetHost().isOk())
{
LL_WARNS_ONCE("Texture") << "LLVOAvatar::updateTextures No host for texture "
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index a5815df20a..b5f0ec7176 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -565,7 +565,7 @@ public:
void updateMeshData();
protected:
void releaseMeshData();
- /*virtual*/ void restoreMeshData();
+ virtual void restoreMeshData();
private:
BOOL mDirtyMesh;
BOOL mMeshTexturesDirty;
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index b1ea8a1bbb..00998b300a 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -510,8 +510,12 @@ BOOL LLVOAvatarSelf::buildMenus()
LLVOAvatarSelf::~LLVOAvatarSelf()
{
- gAgent.setAvatarObject(NULL);
- gAgentWearables.setAvatarObject(NULL);
+ // gAgents pointer might have been set to a different Avatar Self, don't get rid of it if so.
+ if (gAgent.getAvatarObject() == this)
+ {
+ gAgent.setAvatarObject(NULL);
+ gAgentWearables.setAvatarObject(NULL);
+ }
delete mScreenp;
mScreenp = NULL;
}
@@ -928,6 +932,13 @@ void LLVOAvatarSelf::wearableUpdated( EWearableType type, BOOL upload_result )
{
const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second;
const LLVOAvatarDefines::EBakedTextureIndex index = baked_iter->first;
+
+ // if we're editing our appearance, ensure that we're not using baked textures
+ // The baked texture for alpha masks is set explicitly when you hit "save"
+ if (gAgent.cameraCustomizeAvatar())
+ {
+ setNewBakedTexture(index,IMG_DEFAULT_AVATAR);
+ }
if (baked_dict)
{
for (LLVOAvatarDefines::wearables_vec_t::const_iterator type_iter = baked_dict->mWearables.begin();
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index bb09a18cc3..dfd67d0c38 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -122,7 +122,8 @@ LLVoiceChannel::LLVoiceChannel(const LLUUID& session_id, const std::string& sess
mState(STATE_NO_CHANNEL_INFO),
mSessionName(session_name),
mCallDirection(OUTGOING_CALL),
- mIgnoreNextSessionLeave(FALSE)
+ mIgnoreNextSessionLeave(FALSE),
+ mCallEndedByAgent(false)
{
mNotifyArgs["VOICE_CHANNEL_NAME"] = mSessionName;
@@ -412,7 +413,7 @@ void LLVoiceChannel::doSetState(const EState& new_state)
EState old_state = mState;
mState = new_state;
if (!mStateChangedCallback.empty())
- mStateChangedCallback(old_state, mState, mCallDirection);
+ mStateChangedCallback(old_state, mState, mCallDirection, mCallEndedByAgent);
}
//static
@@ -779,7 +780,8 @@ void LLVoiceChannelP2P::handleStatusChange(EStatusType type)
}
else
{
- // other user hung up
+ // other user hung up, so we didn't end the call
+ mCallEndedByAgent = false;
}
deactivate();
}
@@ -810,6 +812,9 @@ void LLVoiceChannelP2P::activate()
{
if (callStarted()) return;
+ //call will be counted as ended by user unless this variable is changed in handleStatusChange()
+ mCallEndedByAgent = true;
+
LLVoiceChannel::activate();
if (callStarted())
diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h
index cb86671305..941cccacc3 100644
--- a/indra/newview/llvoicechannel.h
+++ b/indra/newview/llvoicechannel.h
@@ -58,7 +58,7 @@ public:
OUTGOING_CALL
} EDirection;
- typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state, const EDirection& direction)> state_changed_signal_t;
+ typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state, const EDirection& direction, bool ended_by_agent)> state_changed_signal_t;
// on current channel changed signal
typedef boost::function<void(const LLUUID& session_id)> channel_changed_callback_t;
@@ -122,6 +122,8 @@ protected:
std::string mSessionName;
LLSD mNotifyArgs;
LLSD mCallDialogPayload;
+ // true if call was ended by agent
+ bool mCallEndedByAgent;
BOOL mIgnoreNextSessionLeave;
LLHandle<LLPanel> mLoginNotificationHandle;
diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp
index 24f1c4bd24..55e2c58a52 100644
--- a/indra/newview/llvotree.cpp
+++ b/indra/newview/llvotree.cpp
@@ -1141,7 +1141,7 @@ U32 LLVOTree::drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD
glLoadMatrixf((F32*) scale_mat.mMatrix);
glDrawElements(GL_TRIANGLES, sLODIndexCount[trunk_LOD], GL_UNSIGNED_SHORT, indicesp + sLODIndexOffset[trunk_LOD]);
- gPipeline.addTrianglesDrawn(LEAF_INDICES/3);
+ gPipeline.addTrianglesDrawn(LEAF_INDICES);
stop_glerror();
ret += sLODIndexCount[trunk_LOD];
}
@@ -1191,7 +1191,7 @@ U32 LLVOTree::drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD
glLoadMatrixf((F32*) scale_mat.mMatrix);
glDrawElements(GL_TRIANGLES, LEAF_INDICES, GL_UNSIGNED_SHORT, indicesp);
- gPipeline.addTrianglesDrawn(LEAF_INDICES/3);
+ gPipeline.addTrianglesDrawn(LEAF_INDICES);
stop_glerror();
ret += LEAF_INDICES;
}
@@ -1216,7 +1216,7 @@ U32 LLVOTree::drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD
glLoadMatrixf((F32*) scale_mat.mMatrix);
glDrawElements(GL_TRIANGLES, LEAF_INDICES, GL_UNSIGNED_SHORT, indicesp);
- gPipeline.addTrianglesDrawn(LEAF_INDICES/3);
+ gPipeline.addTrianglesDrawn(LEAF_INDICES);
stop_glerror();
ret += LEAF_INDICES;
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 3cdf485d7d..e95c7f411c 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -36,6 +36,8 @@
#include "llvovolume.h"
+#include <sstream>
+
#include "llviewercontrol.h"
#include "lldir.h"
#include "llflexibleobject.h"
@@ -59,6 +61,7 @@
#include "lltexturefetch.h"
#include "llviewercamera.h"
#include "llviewertexturelist.h"
+#include "llviewerobjectlist.h"
#include "llviewerregion.h"
#include "llviewertextureanim.h"
#include "llworld.h"
@@ -67,6 +70,7 @@
#include "llsdutil.h"
#include "llmediaentry.h"
#include "llmediadataclient.h"
+#include "llmeshrepository.h"
#include "llagent.h"
#include "llviewermediafocus.h"
@@ -88,6 +92,12 @@ LLPointer<LLObjectMediaNavigateClient> LLVOVolume::sObjectMediaNavigateClient =
static LLFastTimer::DeclareTimer FTM_GEN_TRIANGLES("Generate Triangles");
static LLFastTimer::DeclareTimer FTM_GEN_VOLUME("Generate Volumes");
+static LLFastTimer::DeclareTimer FTM_BUILD_MESH("Mesh");
+static LLFastTimer::DeclareTimer FTM_MESH_VFS("VFS");
+static LLFastTimer::DeclareTimer FTM_MESH_STREAM("Stream");
+static LLFastTimer::DeclareTimer FTM_MESH_FACES("Faces");
+static LLFastTimer::DeclareTimer FTM_VOLUME_TEXTURES("Volume Textures");
+
// Implementation class of LLMediaDataClientObject. See llmediadataclient.h
class LLMediaDataClientObjectImpl : public LLMediaDataClientObject
@@ -192,6 +202,7 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re
mMediaImplList.resize(getNumTEs());
mLastFetchedMediaVersion = -1;
+ mIndexInTex = 0;
}
LLVOVolume::~LLVOVolume()
@@ -226,6 +237,11 @@ void LLVOVolume::markDead()
{
removeMediaImpl(i);
}
+
+ if (mSculptTexture.notNull())
+ {
+ mSculptTexture->removeVolume(this);
+ }
}
LLViewerObject::markDead();
@@ -647,6 +663,7 @@ void LLVOVolume::updateTextures()
void LLVOVolume::updateTextureVirtualSize()
{
+ LLFastTimer ftm(FTM_VOLUME_TEXTURES);
// Update the pixel area of all faces
if(mDrawable.isNull() || !mDrawable->isVisible())
@@ -694,6 +711,7 @@ void LLVOVolume::updateTextureVirtualSize()
vsize = area;
imagep->setBoostLevel(LLViewerTexture::BOOST_HUD);
face->setPixelArea(area); // treat as full screen
+ face->setVirtualSize(vsize);
}
else
{
@@ -710,8 +728,7 @@ void LLVOVolume::updateTextureVirtualSize()
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD, FALSE);
}
}
-
- face->setVirtualSize(vsize);
+
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA))
{
if (vsize < min_vsize) min_vsize = vsize;
@@ -739,8 +756,12 @@ void LLVOVolume::updateTextureVirtualSize()
if (isSculpted())
{
LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
- LLUUID id = sculpt_params->getSculptTexture();
- mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+ LLUUID id = sculpt_params->getSculptTexture();
+
+ updateSculptTexture();
+
+
+
if (mSculptTexture.notNull())
{
mSculptTexture->setBoostLevel(llmax((S32)mSculptTexture->getBoostLevel(),
@@ -781,6 +802,7 @@ void LLVOVolume::updateTextureVirtualSize()
mSculptTexture->getHeight(), mSculptTexture->getWidth()));
}
}
+
}
if (getLightTextureID().notNull())
@@ -796,7 +818,7 @@ void LLVOVolume::updateTextureVirtualSize()
*camera));
}
}
-
+
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA))
{
setDebugText(llformat("%.0f:%.0f", fsqrtf(min_vsize),fsqrtf(max_vsize)));
@@ -892,8 +914,27 @@ LLDrawable *LLVOVolume::createDrawable(LLPipeline *pipeline)
return mDrawable;
}
-BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume)
+BOOL LLVOVolume::setVolume(const LLVolumeParams &params, const S32 detail, bool unique_volume)
{
+ LLVolumeParams volume_params = params;
+
+ S32 lod = mLOD;
+
+ if (isSculpted())
+ {
+ // if it's a mesh
+ if ((volume_params.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
+ { //meshes might not have all LODs, get the force detail to best existing LOD
+
+ LLUUID mesh_id = params.getSculptID();
+
+ //profile and path params don't matter for meshes
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+
+ lod = gMeshRepo.getActualMeshLOD(volume_params, lod);
+ }
+ }
+
// Check if we need to change implementations
bool is_flexible = (volume_params.getPathParams().getCurveType() == LL_PCODE_PATH_FLEXIBLE);
if (is_flexible)
@@ -921,43 +962,90 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail
}
}
- if ((LLPrimitive::setVolume(volume_params, mLOD, (mVolumeImpl && mVolumeImpl->isVolumeUnique()))) || mSculptChanged)
+
+
+ if ((LLPrimitive::setVolume(volume_params, lod, (mVolumeImpl && mVolumeImpl->isVolumeUnique()))) || mSculptChanged)
{
mFaceMappingChanged = TRUE;
if (mVolumeImpl)
{
- mVolumeImpl->onSetVolume(volume_params, detail);
+ mVolumeImpl->onSetVolume(volume_params, mLOD);
}
-
+
+ updateSculptTexture();
+
if (isSculpted())
{
- mSculptTexture = LLViewerTextureManager::getFetchedTexture(volume_params.getSculptID(), TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
- if (mSculptTexture.notNull())
+ updateSculptTexture();
+
+ // if it's a mesh
+ if ((volume_params.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
{
- //ignore sculpt GL usage since bao fixed this in a separate branch
- if (!gGLActive)
- {
- gGLActive = TRUE;
- sculpt();
- gGLActive = FALSE;
+ if (getVolume()->getNumVolumeFaces() == 0 || getVolume()->isTetrahedron())
+ {
+ //load request not yet issued, request pipeline load this mesh
+ LLUUID asset_id = volume_params.getSculptID();
+ S32 available_lod = gMeshRepo.loadMesh(this, volume_params, lod);
+ if (available_lod != lod)
+ {
+ LLPrimitive::setVolume(volume_params, available_lod);
+ }
}
- else
+ }
+ else // otherwise is sculptie
+ {
+
+ if (mSculptTexture.notNull())
{
- sculpt();
+ sculpt();
}
}
}
- else
- {
- mSculptTexture = NULL;
- }
return TRUE;
}
return FALSE;
}
+void LLVOVolume::updateSculptTexture()
+{
+ LLPointer<LLViewerFetchedTexture> old_sculpt = mSculptTexture;
+
+ if (isSculpted())
+ {
+ LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+ LLUUID id = sculpt_params->getSculptTexture();
+ mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+ }
+ else
+ {
+ mSculptTexture = NULL;
+ }
+
+ if (mSculptTexture != old_sculpt)
+ {
+ if (old_sculpt.notNull())
+ {
+ old_sculpt->removeVolume(this);
+ }
+ if (mSculptTexture.notNull())
+ {
+ mSculptTexture->addVolume(this);
+ }
+ }
+
+}
+
+
+
+void LLVOVolume::notifyMeshLoaded()
+{
+ mSculptChanged = TRUE;
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, TRUE);
+ dirtySpatialGroup(TRUE);
+}
+
// sculpt replaces generate() for sculpted surfaces
void LLVOVolume::sculpt()
{
@@ -1021,6 +1109,17 @@ void LLVOVolume::sculpt()
}
}
getVolume()->sculpt(sculpt_width, sculpt_height, sculpt_components, sculpt_data, discard_level);
+
+ //notify rebuild any other VOVolumes that reference this sculpty volume
+ for (S32 i = 0; i < mSculptTexture->getNumVolumes(); ++i)
+ {
+ LLVOVolume* volume = (*(mSculptTexture->getVolumeList()))[i];
+ if (volume != this && volume->getVolume() == getVolume())
+ {
+ gPipeline.markRebuild(volume->mDrawable, LLDrawable::REBUILD_GEOMETRY, FALSE);
+ volume->mSculptChanged = TRUE;
+ }
+ }
}
}
@@ -1132,6 +1231,11 @@ void LLVOVolume::updateFaceFlags()
for (S32 i = 0; i < getVolume()->getNumFaces(); i++)
{
LLFace *face = mDrawable->getFace(i);
+ if (!face)
+ {
+ return;
+ }
+
BOOL fullbright = getTE(i)->getFullbright();
face->clearState(LLFace::FULLBRIGHT | LLFace::HUD_RENDER | LLFace::LIGHT);
@@ -1218,6 +1322,10 @@ BOOL LLVOVolume::genBBoxes(BOOL force_global)
for (S32 i = 0; i < getVolume()->getNumFaces(); i++)
{
LLFace *face = mDrawable->getFace(i);
+ if (!face)
+ {
+ continue;
+ }
res &= face->genVolumeBBoxes(*getVolume(), i,
mRelativeXform, mRelativeXformInvTrans,
(mVolumeImpl && mVolumeImpl->isVolumeGlobal()) || force_global);
@@ -1477,7 +1585,14 @@ void LLVOVolume::updateFaceSize(S32 idx)
else
{
const LLVolumeFace& vol_face = getVolume()->getVolumeFace(idx);
- facep->setSize(vol_face.mVertices.size(), vol_face.mIndices.size());
+ if (LLPipeline::sUseTriStrips)
+ {
+ facep->setSize(vol_face.mVertices.size(), vol_face.mTriStrip.size());
+ }
+ else
+ {
+ facep->setSize(vol_face.mVertices.size(), vol_face.mIndices.size());
+ }
}
}
@@ -2403,6 +2518,17 @@ void LLVOVolume::updateSpotLightPriority()
}
+bool LLVOVolume::isLightSpotlight() const
+{
+ LLLightImageParams* params = (LLLightImageParams*) getParameterEntry(LLNetworkData::PARAMS_LIGHT_IMAGE);
+ if (params)
+ {
+ return params->isLightSpotlight();
+ }
+ return false;
+}
+
+
LLViewerTexture* LLVOVolume::getLightTexture()
{
LLUUID id = getLightTextureID();
@@ -2513,6 +2639,23 @@ BOOL LLVOVolume::isSculpted() const
return FALSE;
}
+BOOL LLVOVolume::isMesh() const
+{
+ if (isSculpted())
+ {
+ LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+ U8 sculpt_type = sculpt_params->getSculptType();
+
+ if ((sculpt_type & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
+ // mesh is a mesh
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
BOOL LLVOVolume::hasLightTexture() const
{
if (getParameterEntryInUse(LLNetworkData::PARAMS_LIGHT_IMAGE))
@@ -2851,6 +2994,30 @@ F32 LLVOVolume::getBinRadius()
{
F32 radius;
+ F32 scale = 1.f;
+
+ if (isSculpted())
+ {
+ LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+ LLUUID id = sculpt_params->getSculptTexture();
+ U8 sculpt_type = sculpt_params->getSculptType();
+
+ if ((sculpt_type & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
+ // mesh is a mesh
+ {
+ LLVolume* volume = getVolume();
+ U32 vert_count = 0;
+
+ for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+ vert_count += face.mVertices.size();
+ }
+
+ scale = 1.f/llmax(vert_count/1024.f, 1.f);
+ }
+ }
+
const LLVector3* ext = mDrawable->getSpatialExtents();
BOOL shrink_wrap = mDrawable->isAnimating();
@@ -2909,7 +3076,7 @@ F32 LLVOVolume::getBinRadius()
radius = 8.f;
}
- return llclamp(radius, 0.5f, 256.f);
+ return llclamp(radius*scale, 0.5f, 256.f);
}
const LLVector3 LLVOVolume::getPivotPositionAgent() const
@@ -3227,6 +3394,11 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
draw_info->mExtents[0] = facep->mExtents[0];
draw_info->mExtents[1] = facep->mExtents[1];
validate_draw_info(*draw_info);
+
+ if (LLPipeline::sUseTriStrips)
+ {
+ draw_info->mDrawMode = LLRender::TRIANGLE_STRIP;
+ }
}
}
@@ -3311,7 +3483,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
drawablep->updateFaceSize(i);
LLFace* facep = drawablep->getFace(i);
- if (cur_total > max_total)
+ if (cur_total > max_total || facep->getIndicesCount() <= 0 || facep->getGeomCount() <= 0)
{
facep->mVertexBuffer = NULL;
facep->mLastVertexBuffer = NULL;
@@ -3501,6 +3673,11 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
face->getGeometryVolume(*volume, face->getTEOffset(),
vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex());
}
+
+ if (!face)
+ {
+ llerrs << "WTF?" << llendl;
+ }
}
drawablep->clearState(LLDrawable::REBUILD_ALL);
@@ -3785,7 +3962,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
}
else
{
- if (LLPipeline::sRenderDeferred && te->getBumpmap())
+ if (LLPipeline::sRenderDeferred && LLPipeline::sRenderBump && te->getBumpmap())
{
registerFace(group, facep, LLRenderPass::PASS_BUMP);
}
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index a287d34402..2776988a12 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -179,9 +179,16 @@ public:
/*virtual*/ BOOL setMaterial(const U8 material);
void setTexture(const S32 face);
-
+ S32 getIndexInTex() const {return mIndexInTex ;}
/*virtual*/ BOOL setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume = false);
+ void updateSculptTexture();
+ void setIndexInTex(S32 index) { mIndexInTex = index ;}
void sculpt();
+ static void rebuildMeshAssetCallback(LLVFS *vfs,
+ const LLUUID& asset_uuid,
+ LLAssetType::EType type,
+ void* user_data, S32 status, LLExtStat ext_status);
+
void updateRelativeXform();
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
/*virtual*/ void updateFaceSize(S32 idx);
@@ -213,6 +220,7 @@ public:
LLColor3 getLightBaseColor() const; // not scaled by intensity
LLColor3 getLightColor() const; // scaled by intensity
LLUUID getLightTextureID() const;
+ bool isLightSpotlight() const;
LLVector3 getSpotLightParams() const;
void updateSpotLightPriority();
F32 getSpotLightPriority() const;
@@ -227,6 +235,7 @@ public:
U32 getVolumeInterfaceID() const;
virtual BOOL isFlexible() const;
virtual BOOL isSculpted() const;
+ virtual BOOL isMesh() const;
virtual BOOL hasLightTexture() const;
BOOL isVolumeGlobal() const;
@@ -251,6 +260,7 @@ public:
void mediaNavigated(LLViewerMediaImpl *impl, LLPluginClassMedia* plugin, std::string new_location);
void mediaEvent(LLViewerMediaImpl *impl, LLPluginClassMedia* plugin, LLViewerMediaObserver::EMediaEvent event);
+
// Sync the given media data with the impl and the given te
void syncMediaData(S32 te, const LLSD &media_data, bool merge, bool ignore_agent);
@@ -266,9 +276,11 @@ public:
LLVector3 getApproximateFaceNormal(U8 face_id);
+ void notifyMeshLoaded();
+
// Returns 'true' iff the media data for this object is in flight
bool isMediaDataBeingFetched() const;
-
+
// Returns the "last fetched" media version, or -1 if not fetched yet
S32 getLastFetchedMediaVersion() const { return mLastFetchedMediaVersion; }
@@ -303,7 +315,7 @@ private:
LLPointer<LLViewerFetchedTexture> mLightTexture;
media_list_t mMediaImplList;
S32 mLastFetchedMediaVersion; // as fetched from the server, starts as -1
-
+ S32 mIndexInTex;
// statics
public:
static F32 sLODSlopDistanceFactor;// Changing this to zero, effectively disables the LOD transition slop
diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp
index 0272a2ab34..1749ccef94 100644
--- a/indra/newview/llvowlsky.cpp
+++ b/indra/newview/llvowlsky.cpp
@@ -519,7 +519,7 @@ void LLVOWLSky::drawDome(void)
LLRender::TRIANGLE_STRIP,
0, strips_segment->getRequestedVerts()-1, strips_segment->getRequestedIndices(),
0);
- gPipeline.addTrianglesDrawn(strips_segment->getRequestedIndices() - 2);
+ gPipeline.addTrianglesDrawn(strips_segment->getRequestedIndices(), LLRender::TRIANGLE_STRIP);
}
#else
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index d7e5b464a6..f01e30f9da 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -1027,9 +1027,11 @@ void LLWorld::disconnectRegions()
}
}
+static LLFastTimer::DeclareTimer FTM_ENABLE_SIMULATOR("Enable Sim");
void process_enable_simulator(LLMessageSystem *msg, void **user_data)
{
+ LLFastTimer t(FTM_ENABLE_SIMULATOR);
// enable the appropriate circuit for this simulator and
// add its values into the gSimulator structure
U64 handle;
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index 1940d65ae4..5edf72d4ae 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -128,10 +128,10 @@ void LLWorldMapView::initClass()
sHomeImage = LLUI::getUIImage("map_home.tga");
sTelehubImage = LLUI::getUIImage("map_telehub.tga");
sInfohubImage = LLUI::getUIImage("map_infohub.tga");
- sEventImage = LLUI::getUIImage("map_event.tga");
- sEventMatureImage = LLUI::getUIImage("map_event_mature.tga");
+ sEventImage = LLUI::getUIImage("Parcel_PG_Dark");
+ sEventMatureImage = LLUI::getUIImage("Parcel_M_Dark");
// To Do: update the image resource for adult events.
- sEventAdultImage = LLUI::getUIImage("map_event_adult.tga");
+ sEventAdultImage = LLUI::getUIImage("Parcel_R_Dark");
sTrackCircleImage = LLUI::getUIImage("map_track_16.tga");
sTrackArrowImage = LLUI::getUIImage("direction_arrow.tga");
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index d5f87b73fe..f90f8f1b89 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -70,6 +70,7 @@
#include "llgldbg.h"
#include "llhudmanager.h"
#include "lllightconstants.h"
+#include "llmeshrepository.h"
#include "llresmgr.h"
#include "llselectmgr.h"
#include "llsky.h"
@@ -103,6 +104,7 @@
#include "llspatialpartition.h"
#include "llmutelist.h"
#include "lltoolpie.h"
+#include "llcurl.h"
#ifdef _DEBUG
@@ -270,6 +272,7 @@ BOOL LLPipeline::sDelayVBUpdate = TRUE;
BOOL LLPipeline::sFastAlpha = TRUE;
BOOL LLPipeline::sDisableShaders = FALSE;
BOOL LLPipeline::sRenderBump = TRUE;
+BOOL LLPipeline::sUseTriStrips = TRUE;
BOOL LLPipeline::sUseFarClip = TRUE;
BOOL LLPipeline::sShadowRender = FALSE;
BOOL LLPipeline::sWaterReflections = FALSE;
@@ -358,6 +361,7 @@ void LLPipeline::init()
sDynamicLOD = gSavedSettings.getBOOL("RenderDynamicLOD");
sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
+ sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights");
sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles");
@@ -1140,9 +1144,15 @@ void LLPipeline::allocDrawable(LLViewerObject *vobj)
}
+static LLFastTimer::DeclareTimer FTM_UNLINK("Unlink");
+static LLFastTimer::DeclareTimer FTM_REMOVE_FROM_MOVE_LIST("Movelist");
+static LLFastTimer::DeclareTimer FTM_REMOVE_FROM_SPATIAL_PARTITION("Spatial Partition");
+static LLFastTimer::DeclareTimer FTM_REMOVE_FROM_LIGHT_SET("Light Set");
+static LLFastTimer::DeclareTimer FTM_REMOVE_FROM_HIGHLIGHT_SET("Highlight Set");
+
void LLPipeline::unlinkDrawable(LLDrawable *drawable)
{
- LLFastTimer t(FTM_PIPELINE);
+ LLFastTimer t(FTM_UNLINK);
assertInitialized();
@@ -1151,6 +1161,7 @@ void LLPipeline::unlinkDrawable(LLDrawable *drawable)
// Based on flags, remove the drawable from the queues that it's on.
if (drawablep->isState(LLDrawable::ON_MOVE_LIST))
{
+ LLFastTimer t(FTM_REMOVE_FROM_MOVE_LIST);
LLDrawable::drawable_vector_t::iterator iter = std::find(mMovedList.begin(), mMovedList.end(), drawablep);
if (iter != mMovedList.end())
{
@@ -1160,6 +1171,7 @@ void LLPipeline::unlinkDrawable(LLDrawable *drawable)
if (drawablep->getSpatialGroup())
{
+ LLFastTimer t(FTM_REMOVE_FROM_SPATIAL_PARTITION);
if (!drawablep->getSpatialGroup()->mSpatialPartition->remove(drawablep, drawablep->getSpatialGroup()))
{
#ifdef LL_RELEASE_FOR_DOWNLOAD
@@ -1170,18 +1182,23 @@ void LLPipeline::unlinkDrawable(LLDrawable *drawable)
}
}
- mLights.erase(drawablep);
- for (light_set_t::iterator iter = mNearbyLights.begin();
- iter != mNearbyLights.end(); iter++)
{
- if (iter->drawable == drawablep)
+ LLFastTimer t(FTM_REMOVE_FROM_LIGHT_SET);
+ mLights.erase(drawablep);
+
+ for (light_set_t::iterator iter = mNearbyLights.begin();
+ iter != mNearbyLights.end(); iter++)
{
- mNearbyLights.erase(iter);
- break;
+ if (iter->drawable == drawablep)
+ {
+ mNearbyLights.erase(iter);
+ break;
+ }
}
}
{
+ LLFastTimer t(FTM_REMOVE_FROM_HIGHLIGHT_SET);
HighlightItem item(drawablep);
mHighlightSet.erase(item);
@@ -1354,6 +1371,7 @@ void LLPipeline::updateMoveNormalAsync(LLDrawable* drawablep)
if (!drawablep)
{
llerrs << "updateMove called with NULL drawablep" << llendl;
+ return;
}
if (drawablep->isState(LLDrawable::EARLY_MOVE))
{
@@ -1783,6 +1801,8 @@ void LLPipeline::rebuildPriorityGroups()
assertInitialized();
+ gMeshRepo.notifyLoadedMeshes();
+
// Iterate through all drawables on the priority build queue,
for (LLSpatialGroup::sg_list_t::iterator iter = mGroupQ1.begin();
iter != mGroupQ1.end(); ++iter)
@@ -1793,6 +1813,7 @@ void LLPipeline::rebuildPriorityGroups()
}
mGroupQ1.clear();
+
}
void LLPipeline::rebuildGroups()
@@ -1957,7 +1978,7 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)
if (root && root->getParent() && root->getVObj() && root->getVObj()->isAttachment())
{
LLVOAvatar* av = root->getParent()->getVObj()->asAvatar();
- if (av->isImpostor())
+ if (av && av->isImpostor())
{
return;
}
@@ -3405,27 +3426,14 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
gGLLastMatrix = NULL;
glLoadMatrixd(gGLModelView);
- renderHighlights();
- mHighlightFaces.clear();
-
- renderDebug();
-
- LLVertexBuffer::unbind();
-
- if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
- {
- // Render debugging beacons.
- gObjectList.renderObjectBeacons();
- LLHUDObject::renderAll();
- gObjectList.resetObjectBeacons();
- }
-
if (occlude)
{
occlude = FALSE;
gGLLastMatrix = NULL;
glLoadMatrixd(gGLModelView);
doOcclusion(camera);
+ gGLLastMatrix = NULL;
+ glLoadMatrixd(gGLModelView);
}
}
@@ -3495,9 +3503,19 @@ void LLPipeline::renderGeomShadow(LLCamera& camera)
}
-void LLPipeline::addTrianglesDrawn(S32 count)
+void LLPipeline::addTrianglesDrawn(S32 index_count, U32 render_type)
{
assertInitialized();
+ S32 count = 0;
+ if (render_type == LLRender::TRIANGLE_STRIP)
+ {
+ count = index_count-2;
+ }
+ else
+ {
+ count = index_count/3;
+ }
+
mTrianglesDrawn += count;
mBatchCount++;
mMaxBatchSize = llmax(mMaxBatchSize, count);
@@ -4260,7 +4278,7 @@ void LLPipeline::setupAvatarLights(BOOL for_edit)
glLightf (GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.0f);
glLightf (GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.0f);
glLightf (GL_LIGHT1, GL_SPOT_EXPONENT, 0.0f);
- glLightf (GL_LIGHT1, GL_SPOT_CUTOFF, 180.0f);
+ glLightf (GL_LIGHT1, GL_SPOT_CUTOFF, 180.0f);
}
else if (gAvatarBacklight) // Always true (unless overridden in a devs .ini)
{
@@ -4548,32 +4566,41 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
LLVector4 light_pos_gl(light_pos, 1.0f);
F32 light_radius = llmax(light->getLightRadius(), 0.001f);
- F32 atten, quad;
-#if 0 //1.9.1
- if (pool->getVertexShaderLevel() > 0)
- {
- atten = light_radius;
- quad = llmax(light->getLightFalloff(), 0.0001f);
- }
- else
-#endif
- {
- F32 x = (3.f * (1.f + light->getLightFalloff()));
- atten = x / (light_radius); // % of brightness at radius
- quad = 0.0f;
- }
+ F32 x = (3.f * (1.f + light->getLightFalloff())); // why this magic? probably trying to match a historic behavior.
+ float linatten = x / (light_radius); // % of brightness at radius
+
mHWLightColors[cur_light] = light_color;
S32 gllight = GL_LIGHT0+cur_light;
glLightfv(gllight, GL_POSITION, light_pos_gl.mV);
glLightfv(gllight, GL_DIFFUSE, light_color.mV);
glLightfv(gllight, GL_AMBIENT, LLColor4::black.mV);
- glLightfv(gllight, GL_SPECULAR, LLColor4::black.mV);
glLightf (gllight, GL_CONSTANT_ATTENUATION, 0.0f);
- glLightf (gllight, GL_LINEAR_ATTENUATION, atten);
- glLightf (gllight, GL_QUADRATIC_ATTENUATION, quad);
- glLightf (gllight, GL_SPOT_EXPONENT, 0.0f);
- glLightf (gllight, GL_SPOT_CUTOFF, 180.0f);
+ glLightf (gllight, GL_LINEAR_ATTENUATION, linatten);
+ glLightf (gllight, GL_QUADRATIC_ATTENUATION, 0.0f);
+ if (light->isLightSpotlight()) // directional (spot-)light
+ {
+ LLVector3 spotparams = light->getSpotLightParams();
+ LLQuaternion quat = light->getRenderRotation();
+ LLVector3 at_axis(0,0,-1); // this matches deferred rendering's object light direction
+ at_axis *= quat;
+ //llinfos << "SPOT!!!!!!! fov: " << spotparams.mV[0] << " focus: " << spotparams.mV[1] << " dir: " << at_axis << llendl;
+ glLightfv(gllight, GL_SPOT_DIRECTION, at_axis.mV);
+ glLightf (gllight, GL_SPOT_EXPONENT, 2.0f); // 2.0 = good old dot product ^ 2
+ glLightf (gllight, GL_SPOT_CUTOFF, 90.0f); // hemisphere
+ const float specular[] = {0.f, 0.f, 0.f, 0.f};
+ glLightfv(gllight, GL_SPECULAR, specular);
+ }
+ else // omnidirectional (point) light
+ {
+ glLightf (gllight, GL_SPOT_EXPONENT, 0.0f);
+ glLightf (gllight, GL_SPOT_CUTOFF, 180.0f);
+
+ // we use specular.w = 1.0 as a cheap hack for the shaders to know that this is omnidirectional rather than a spotlight
+ const float specular[] = {0.f, 0.f, 0.f, 1.f};
+ glLightfv(gllight, GL_SPECULAR, specular);
+ //llinfos << "boring light" << llendl;
+ }
cur_light++;
if (cur_light >= 8)
{
@@ -4589,7 +4616,6 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
glLightfv(gllight, GL_AMBIENT, LLColor4::black.mV);
glLightfv(gllight, GL_SPECULAR, LLColor4::black.mV);
}
-
if (gAgent.getAvatarObject() &&
gAgent.getAvatarObject()->mSpecialRenderMode == 3)
{
@@ -4600,13 +4626,10 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
LLVector4 light_pos_gl(light_pos, 1.0f);
F32 light_radius = 16.f;
- F32 atten, quad;
- {
- F32 x = 3.f;
- atten = x / (light_radius); // % of brightness at radius
- quad = 0.0f;
- }
+ F32 x = 3.f;
+ float linatten = x / (light_radius); // % of brightness at radius
+
mHWLightColors[2] = light_color;
S32 gllight = GL_LIGHT2;
glLightfv(gllight, GL_POSITION, light_pos_gl.mV);
@@ -4614,8 +4637,8 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
glLightfv(gllight, GL_AMBIENT, LLColor4::black.mV);
glLightfv(gllight, GL_SPECULAR, LLColor4::black.mV);
glLightf (gllight, GL_CONSTANT_ATTENUATION, 0.0f);
- glLightf (gllight, GL_LINEAR_ATTENUATION, atten);
- glLightf (gllight, GL_QUADRATIC_ATTENUATION, quad);
+ glLightf (gllight, GL_LINEAR_ATTENUATION, linatten);
+ glLightf (gllight, GL_QUADRATIC_ATTENUATION, 0.0f);
glLightf (gllight, GL_SPOT_EXPONENT, 0.0f);
glLightf (gllight, GL_SPOT_CUTOFF, 180.0f);
}
@@ -5349,6 +5372,7 @@ void LLPipeline::resetVertexBuffers(LLDrawable* drawable)
void LLPipeline::resetVertexBuffers()
{
sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
+ sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
@@ -5806,6 +5830,12 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
gGL.getTexUnit(0)->activate();
gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+
+ if (LLRenderTarget::sUseFBO)
+ { //copy depth buffer from mScreen to framebuffer
+ LLRenderTarget::copyContentsToFramebuffer(mScreen, 0, 0, mScreen.getWidth(), mScreen.getHeight(),
+ 0, 0, mScreen.getWidth(), mScreen.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);
+ }
}
@@ -6641,7 +6671,7 @@ void LLPipeline::renderDeferredLighting()
{ //draw box if camera is outside box
if (render_local)
{
- if (volume->getLightTexture())
+ if (volume->isLightSpotlight())
{
drawablep->getVOVolume()->updateSpotLightPriority();
spot_lights.push_back(drawablep);
@@ -6658,7 +6688,7 @@ void LLPipeline::renderDeferredLighting()
}
else if (render_fullscreen)
{
- if (volume->getLightTexture())
+ if (volume->isLightSpotlight())
{
drawablep->getVOVolume()->updateSpotLightPriority();
fullscreen_spot_lights.push_back(drawablep);
@@ -6884,6 +6914,24 @@ void LLPipeline::renderDeferredLighting()
mRenderTypeMask = render_mask;
}
+ {
+ //render highlights, etc.
+ renderHighlights();
+ mHighlightFaces.clear();
+
+ renderDebug();
+
+ LLVertexBuffer::unbind();
+
+ if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
+ {
+ // Render debugging beacons.
+ gObjectList.renderObjectBeacons();
+ LLHUDObject::renderAll();
+ gObjectList.resetObjectBeacons();
+ }
+ }
+
mScreen.flush();
}
@@ -7232,7 +7280,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
LLGLDisable cull(GL_CULL_FACE);
updateCull(camera, ref_result, 1);
stateSort(camera, ref_result);
- }
+ }
ref_mask = mRenderTypeMask;
mRenderTypeMask = mask;
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index c5285943e8..c61274bfb1 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -58,6 +58,8 @@ class LLCubeMap;
class LLCullResult;
class LLVOAvatar;
class LLGLSLShader;
+class LLCurlRequest;
+class LLMeshResponder;
typedef enum e_avatar_skinning_method
{
@@ -277,7 +279,7 @@ public:
LLCullResult::sg_list_t::iterator beginAlphaGroups();
LLCullResult::sg_list_t::iterator endAlphaGroups();
- void addTrianglesDrawn(S32 count);
+ void addTrianglesDrawn(S32 index_count, U32 render_type = LLRender::TRIANGLES);
BOOL hasRenderType(const U32 type) const { return (type && (mRenderTypeMask & (1<<type))) ? TRUE : FALSE; }
BOOL hasRenderDebugFeatureMask(const U32 mask) const { return (mRenderDebugFeatureMask & mask) ? TRUE : FALSE; }
BOOL hasRenderDebugMask(const U32 mask) const { return (mRenderDebugMask & mask) ? TRUE : FALSE; }
@@ -447,7 +449,7 @@ public:
static BOOL sFastAlpha;
static BOOL sDisableShaders; // if TRUE, rendering will be done without shaders
static BOOL sRenderBump;
- static BOOL sUseFBO;
+ static BOOL sUseTriStrips;
static BOOL sUseFarClip;
static BOOL sShadowRender;
static BOOL sWaterReflections;
@@ -672,6 +674,13 @@ public:
protected:
std::vector<LLFace*> mSelectedFaces;
+
+ typedef std::map<LLUUID, std::set<LLUUID> > mesh_load_map;
+ mesh_load_map mLoadingMeshes[4];
+
+ typedef std::list<LLMeshResponder*> mesh_response_list;
+ mesh_response_list mMeshResponseList;
+
LLPointer<LLViewerFetchedTexture> mFaceSelectImagep;
LLPointer<LLViewerTexture> mBloomImagep;
LLPointer<LLViewerTexture> mBloomImage2p;
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index ca579616d8..b33d4f73a4 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -554,7 +554,7 @@
reference="White" />
<color
name="ObjectChatColor"
- reference="EmphasisColor_35" />
+ reference="EmphasisColor" />
<color
name="OverdrivenColor"
reference="Red" />
diff --git a/indra/newview/skins/default/textures/icons/Inv_Shoe.png b/indra/newview/skins/default/textures/icons/Inv_Shoe.png
index 51e1c7bbb7..1f52b0a6b6 100644
--- a/indra/newview/skins/default/textures/icons/Inv_Shoe.png
+++ b/indra/newview/skins/default/textures/icons/Inv_Shoe.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/object_icon.png b/indra/newview/skins/default/textures/icons/object_icon.png
new file mode 100644
index 0000000000..223874e631
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/object_icon.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index ccf49f6a9f..9984cfcf5d 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -143,12 +143,12 @@ with the same filename but different name
<texture name="DownArrow" file_name="bottomtray/DownArrow.png" preload="false" />
- <texture name="DropDown_Disabled" file_name="widgets/DropDown_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="DropDown_Over" file_name="widgets/DropDown_Over.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="DropDown_Selected" file_name="widgets/DropDown_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+ <texture name="DropDown_Disabled" file_name="widgets/DropDown_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+ <texture name="DropDown_Over" file_name="widgets/DropDown_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+ <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+ <texture name="DropDown_Selected" file_name="widgets/DropDown_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+ <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+ <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
<texture name="DropTarget" file_name="widgets/DropTarget.png" preload="false" />
@@ -245,6 +245,7 @@ with the same filename but different name
<texture name="Inv_LookFolderOpen" file_name="icons/Inv_LookFolderOpen.png" preload="false" />
<texture name="Inv_LookFolderClosed" file_name="icons/Inv_LookFolderClosed.png" preload="false" />
<texture name="Inv_Landmark" file_name="icons/Inv_Landmark.png" preload="false" />
+ <texture name="Inv_Mesh" file_name="icons/Inv_Mesh.png" preload="false" />
<texture name="Inv_Notecard" file_name="icons/Inv_Notecard.png" preload="false" />
<texture name="Inv_Object" file_name="icons/Inv_Object.png" preload="false" />
<texture name="Inv_Pants" file_name="icons/Inv_Pants.png" preload="false" />
@@ -265,8 +266,8 @@ with the same filename but different name
<texture name="Linden_Dollar_Alert" file_name="widgets/Linden_Dollar_Alert.png"/>
<texture name="Linden_Dollar_Background" file_name="widgets/Linden_Dollar_Background.png"/>
- <texture name="ListItem_Select" file_name="widgets/ListItem_Select.png" preload="true" />
- <texture name="ListItem_Over" file_name="widgets/ListItem_Over.png" preload="true" />
+ <texture name="ListItem_Select" file_name="widgets/ListItem_Select.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" />
+ <texture name="ListItem_Over" file_name="widgets/ListItem_Over.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" />
<texture name="Lock" file_name="icons/Lock.png" preload="false" />
<texture name="Lock2" file_name="navbar/Lock.png" preload="false" />
@@ -515,6 +516,7 @@ with the same filename but different name
<texture name="SliderThumb_Press" file_name="widgets/SliderThumb_Press.png" />
<texture name="SL_Logo" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="OBJECT_Icon" file_name="icons/object_icon.png" preload="true" />
<texture name="Snapshot_Off" file_name="bottomtray/Snapshot_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="Snapshot_Over" file_name="bottomtray/Snapshot_Over.png" preload="false" />
@@ -632,8 +634,8 @@ with the same filename but different name
<texture name="Unread_Msg" file_name="bottomtray/Unread_Msg.png" preload="false" />
<texture name="Unread_IM" file_name="bottomtray/Unread_IM.png" preload="false" />
- <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
- <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="Volume_Background" file_name="windows/Volume_Background.png" preload="false"
+ scale.left="6" scale.top="33" scale.right="63" scale.bottom="10" />
<texture name="VoicePTT_Lvl1" file_name="bottomtray/VoicePTT_Lvl1.png" preload="false" />
<texture name="VoicePTT_Lvl2" file_name="bottomtray/VoicePTT_Lvl2.png" preload="false" />
@@ -641,6 +643,9 @@ with the same filename but different name
<texture name="VoicePTT_Off" file_name="bottomtray/VoicePTT_Off.png" preload="false" />
<texture name="VoicePTT_On" file_name="bottomtray/VoicePTT_On.png" preload="false" />
+ <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+
<texture name="WebBasedMediaBackground" file_name="windows/WebBasedMediaBackground.png" preload="false" />
<texture name="Widget_DownArrow" file_name="icons/Widget_DownArrow.png" preload="true" />
@@ -729,6 +734,8 @@ with the same filename but different name
<texture name="icon_place_for_sale.tga" />
<texture name="icon_top_pick.tga" />
+ <texture name="inv_folder_mesh.tga"/>
+ <texture name="inv_item_mesh.tga"/>
<texture name="lag_status_critical.tga" />
<texture name="lag_status_good.tga" />
<texture name="lag_status_warning.tga" />
diff --git a/indra/newview/skins/default/textures/windows/Volume_Background.png b/indra/newview/skins/default/textures/windows/Volume_Background.png
new file mode 100644
index 0000000000..43aaa441f5
--- /dev/null
+++ b/indra/newview/skins/default/textures/windows/Volume_Background.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/world/BeaconArrow.png b/indra/newview/skins/default/textures/world/BeaconArrow.png
index 12dc246d51..54934f738a 100644
--- a/indra/newview/skins/default/textures/world/BeaconArrow.png
+++ b/indra/newview/skins/default/textures/world/BeaconArrow.png
Binary files differ
diff --git a/indra/newview/skins/default/xui/de/floater_about.xml b/indra/newview/skins/default/xui/de/floater_about.xml
index 0beb54032f..5f3762c224 100644
--- a/indra/newview/skins/default/xui/de/floater_about.xml
+++ b/indra/newview/skins/default/xui/de/floater_about.xml
@@ -73,7 +73,8 @@ google-perftools Copyright (c) 2005, Google Inc.
Alle Rechte vorbehalten. Details siehe licenses.txt.
-Voice-Chat-Audiocoding: Polycom(R) Siren14(TM) (ITU-T Empf.G.722.1 Anhang C)
+Voice-Chat-Audiocoding: Polycom(R) Siren14(TM)
+(ITU-T Empf.G.722.1 Anhang C)
</text_editor>
</panel>
</tab_container>
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 cd5abf86e0..aec1179901 100644
--- a/indra/newview/skins/default/xui/de/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_about_land.xml
@@ -12,7 +12,7 @@
<floater.string name="Remaining">
Restzeit
</floater.string>
- <tab_container name="landtab">
+ <tab_container name="landtab" width="489" tab_min_width="40">
<panel label="ALLGEMEIN" name="land_general_panel">
<panel.string name="new users only">
Nur neue Benutzer
@@ -83,7 +83,7 @@
<text name="GroupText">
Leyla Linden
</text>
- <button label="Festlegen" label_selected="Einstellen..." name="Set..."/>
+ <button label="Festlegen" label_selected="Einstellen..." name="Set..." width="90"/>
<check_box label="Übertragung an Gruppe zulassen" name="check deed" tool_tip="Ein Gruppen-Officer kann dieses Land der Gruppe übertragen. Das Land wird dann über die Landzuteilung der Gruppe verwaltet."/>
<button label="Übertragung" label_selected="Übertragen..." name="Deed..." tool_tip="Sie können Land nur übertragen, wenn Sie in der ausgewählten Gruppe Officer sind."/>
<check_box label="Eigentümer leistet Beitrag durch Übertragung" name="check contrib" tool_tip="Wenn das Land an die Gruppe übertragen wird, trägt der frühere Eigentümer ausreichend Landnutzungsrechte bei, um es zu halten."/>
@@ -101,10 +101,10 @@
<text name="For sale to">
Zum Verkauf an: [BUYER]
</text>
- <text name="Sell with landowners objects in parcel." width="210">
+ <text name="Sell with landowners objects in parcel." left_delta="-50" width="240">
Objekte sind im Verkauf eingeschlossen
</text>
- <text name="Selling with no objects in parcel." width="237">
+ <text name="Selling with no objects in parcel." width="260">
Objekte sind im Verkauf nicht eingeschlossen
</text>
<button bottom="-222" label="Landverkauf abbrechen" label_selected="Landverkauf abbrechen" name="Cancel Land Sale"/>
@@ -230,7 +230,7 @@ werden.
<text left="14" name="Owned by parcel owner:" width="200">
Im Eigentum des Parzellenbesitzers:
</text>
- <text left="204" name="owner_objects_text" width="48">
+ <text left="204" left_delta="200" name="owner_objects_text" width="48">
[COUNT]
</text>
<button label="Anzeigen" label_selected="Anzeigen" name="ShowOwner" right="-135" width="60"/>
@@ -257,7 +257,7 @@ werden.
<text left="204" name="selected_objects_text" width="48">
[COUNT]
</text>
- <text left="4" name="Autoreturn" width="380">
+ <text left="4" name="Autoreturn" width="410">
Objekte anderer Einwohner automatisch zurückgeben (Minuten, 0 für aus):
</text>
<line_editor name="clean other time" right="-10" width="56"/>
@@ -269,7 +269,7 @@ werden.
<name_list name="owner list">
<name_list.columns label="Typ" name="type"/>
<name_list.columns label="Name" name="name"/>
- <name_list.columns label="Zählen" name="count"/>
+ <name_list.columns label="Zählen" name="count" width="80"/>
<name_list.columns label="Aktuellster" name="mostrecent"/>
</name_list>
</panel>
@@ -368,7 +368,7 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<text name="landing_point">
Landepunkt: [LANDING]
</text>
- <button label="Festlegen" label_selected="Festlegen" left="234" name="Set" tool_tip="Legt den Landepunkt fest, an dem Besucher ankommen. Legt die Position Ihres Avatars innerhalb dieser Parzelle fest." width="70"/>
+ <button label="Festlegen" label_selected="Festlegen" left="234" right="-88" name="Set" tool_tip="Legt den Landepunkt fest, an dem Besucher ankommen. Legt die Position Ihres Avatars innerhalb dieser Parzelle fest." width="70"/>
<button label="Löschen" label_selected="Löschen" left="312" name="Clear" tool_tip="Landepunkt löschen" width="70"/>
<text name="Teleport Routing: ">
Teleport-Route:
@@ -444,7 +444,7 @@ Nur große Parzellen können in der Suche aufgeführt werden.
Zugang zu dieser Parzelle
</text>
<check_box label="Öffentlichen Zugang erlauben [MATURITY]" name="public_access"/>
- <text name="Only Allow">
+ <text name="Only Allow" width="400">
Zugang auf Einwohner beschränken, die überprüft wurden von:
</text>
<check_box label="Zahlungsinformation gespeichert [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Nicht identifizierte Einwohner verbannen."/>
diff --git a/indra/newview/skins/default/xui/de/floater_animation_preview.xml b/indra/newview/skins/default/xui/de/floater_animation_preview.xml
index ce971d158d..be573b524f 100644
--- a/indra/newview/skins/default/xui/de/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/de/floater_animation_preview.xml
@@ -180,6 +180,6 @@ Maximal erlaubt sind [MAX_LENGTH] Sekunden.
Wir empfehlen exportierte BVH-Dateien aus Poser 4.
</text>
- <button label="Hochladen ([AMOUNT] L$)" name="ok_btn"/>
- <button label="Abbrechen" name="cancel_btn"/>
+ <button label="Hochladen ([AMOUNT] L$)" name="ok_btn" width="160"/>
+ <button label="Abbrechen" name="cancel_btn" left="180" width="88"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_avatar_picker.xml b/indra/newview/skins/default/xui/de/floater_avatar_picker.xml
index bc78ccd7f8..f1281bfb9b 100644
--- a/indra/newview/skins/default/xui/de/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/de/floater_avatar_picker.xml
@@ -21,11 +21,12 @@
<tab_container name="ResidentChooserTabs">
<panel label="Suchen" name="SearchPanel">
<text name="InstructSearchResidentName">
- Geben Sie einen Teil des Namens einer Person ein:
+ Geben Sie einen Teil des Namens einer
+Person ein:
</text>
- <line_editor bottom_delta="-36" name="Edit"/>
- <button label="Los" label_selected="Los" name="Find"/>
- <scroll_list bottom_delta="-79" height="74" name="SearchResults"/>
+ <line_editor bottom_delta="-76" name="Edit" top_pad="16"/>
+ <button label="Los" label_selected="Los" name="Find" top="70"/>
+ <scroll_list top="80" height="54" name="SearchResults"/>
</panel>
<panel label="Freunde" name="FriendsPanel">
<text name="InstructSelectFriend">
diff --git a/indra/newview/skins/default/xui/de/floater_avatar_textures.xml b/indra/newview/skins/default/xui/de/floater_avatar_textures.xml
index 3be5194a8f..cf1b809aa1 100644
--- a/indra/newview/skins/default/xui/de/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/de/floater_avatar_textures.xml
@@ -3,10 +3,10 @@
<floater.string name="InvalidAvatar">
UNGÃœLTIGER AVATAR
</floater.string>
- <text name="label">
+ <text name="label" width="120">
Gebackene Texturen
</text>
- <text name="composite_label" width="150">
+ <text name="composite_label" width="170">
Zusammengesetzte Texturen
</text>
<button label="Läd IDs in Konsole ab" label_selected="Abladen" name="Dump"/>
@@ -23,7 +23,8 @@
<texture_picker label="Auge" name="eyes_iris"/>
<texture_picker label="Alpha: Augen" name="eyes_alpha"/>
<texture_picker label="Oberkörper" name="upper-baked"/>
- <texture_picker label="Oberkörper: Körperfarbe" name="upper_bodypaint"/>
+ <texture_picker label="Oberkörper: Körperfarbe" name="upper_bodypaint" width=
+ "140"/>
<texture_picker label="Unterhemd" name="upper_undershirt"/>
<texture_picker label="Handschuhe" name="upper_gloves"/>
<texture_picker label="Hemd" name="upper_shirt"/>
@@ -31,7 +32,8 @@
<texture_picker label="Alpha: Oben" name="upper_alpha"/>
<texture_picker label="Obere Tattoos" name="upper_tattoo"/>
<texture_picker label="Unterkörper" name="lower-baked"/>
- <texture_picker label="Unterkörper: Körperfarbe" name="lower_bodypaint"/>
+ <texture_picker label="Unterkörper: Körperfarbe" name="lower_bodypaint" width=
+ "140"/>
<texture_picker label="Unterhose" name="lower_underpants"/>
<texture_picker label="Socken" name="lower_socks"/>
<texture_picker label="Schuhe" name="lower_shoes"/>
diff --git a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml
index 218c66d298..1d766ac07b 100644
--- a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml
@@ -43,7 +43,7 @@
Jeder:
</text>
<check_box label="Kopieren" name="everyone_copy"/>
- <text name="NextOwnerLabel">
+ <text name="NextOwnerLabel" top="160" left="10">
Nächster Eigentümer:
</text>
<check_box label="Bearbeiten" name="next_owner_modify"/>
diff --git a/indra/newview/skins/default/xui/de/floater_buy_currency.xml b/indra/newview/skins/default/xui/de/floater_buy_currency.xml
index aa6201ec26..72959c7a0c 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_currency.xml
@@ -59,8 +59,9 @@
</text>
<button label="Jetzt kaufen" name="buy_btn"/>
<button label="Abbrechen" name="cancel_btn"/>
- <text name="info_cannot_buy">
- Kauf nicht möglich
+ <text name="info_cannot_buy" left="160" width="200" height="40">
+ Kauf nicht
+möglich
</text>
<button label="Weiter zum Internet" name="error_web"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_buy_land.xml b/indra/newview/skins/default/xui/de/floater_buy_land.xml
index 4c59f1e8e6..5efa557869 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_land.xml
@@ -3,41 +3,41 @@
<text name="region_name_label">
Region:
</text>
- <text left="580" name="region_name_text">
+ <text left="680" name="region_name_text" left_delta="140">
(unbekannt)
</text>
<text name="region_type_label">
Typ:
</text>
- <text left="580" name="region_type_text">
+ <text left="680" name="region_type_text" left_delta="140">
(unbekannt)
</text>
<text name="estate_name_label">
Grundstück:
</text>
- <text left="580" name="estate_name_text">
+ <text left="680" name="estate_name_text" left_delta="140">
(unbekannt)
</text>
<text name="estate_owner_label" right="600" width="200">
Grundstückseigentümer:
</text>
- <text left="580" name="estate_owner_text">
+ <text left="680" name="estate_owner_text" left_delta="140">
(unbekannt)
</text>
- <text name="resellable_changeable_label">
+ <text name="resellable_changeable_label" left="410">
Gekauftes Land in dieser Region:
</text>
- <text name="resellable_clause">
+ <text name="resellable_clause" left="410">
Wiederverkauf möglich oder nicht möglich.
</text>
- <text name="changeable_clause">
+ <text name="changeable_clause" left="410">
Darft oder darf nicht zusammengelegt/unterteilt werden.
</text>
- <text name="covenant_text">
+ <text name="covenant_text" left="410">
Sie müssen dem Grundstücksvertrag zustimmen:
</text>
<text left="470" name="covenant_timestamp_text"/>
- <text_editor name="covenant_editor">
+ <text_editor name="covenant_editor" left="470">
Wird geladen...
</text_editor>
<check_box label="Ich stimme dem obigen Vertrag zu." name="agree_covenant"/>
@@ -67,7 +67,7 @@ Objekte im Verkauf eingeschlossen
<text name="error_message">
Irgendetwas stimmt nicht.
</text>
- <button label="Gehe zu Website" name="error_web"/>
+ <button label="Gehe zu Website" name="error_web" top_delta="136"/>
<text name="account_action">
Macht Sie zum Premium-Mitglied.
</text>
@@ -79,8 +79,9 @@ Objekte im Verkauf eingeschlossen
<combo_box.item label="7,50 US$/Monat, vierteljährliche Abrechnung" name="US$7.50/month,billedquarterly"/>
<combo_box.item label="6,00 US$/Monat, jährliche Abrechnung" name="US$6.00/month,billedannually"/>
</combo_box>
- <text name="land_use_action">
- Erhöhen Sie Ihre monatlichen Landnutzungsgebühren auf 40 US$/month.
+ <text name="land_use_action" top="270" height="36">
+ Erhöhen Sie Ihre monatlichen Landnutzungsgebühren
+auf 40 US$/month.
</text>
<text name="land_use_reason">
Sie besitzen 1309 m² Land.
diff --git a/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml
index 7f4dc4a79e..9baf30fb53 100644
--- a/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml
@@ -66,7 +66,7 @@
Key-Zeit:
</text>
<spinner label="Std." name="WLCurKeyHour" />
- <spinner label="Min." name="WLCurKeyMin" />
+ <spinner label="Min." name="WLCurKeyMin" label_width="100" width="66"/>
<text name="WLCurKeyTimeText2">
Key-Voreinstellung:
</text>
@@ -79,8 +79,8 @@
Zykluslänge:
</text>
<spinner label="Std." name="WLLengthOfDayHour" />
- <spinner label="Min." name="WLLengthOfDayMin" />
- <spinner label="Sek." name="WLLengthOfDaySec" />
+ <spinner label="Min." name="WLLengthOfDayMin" label_width="100" width="66"/>
+ <spinner label="Sek." name="WLLengthOfDaySec" label_width="100" width="66"/>
<text name="DayCycleText3">
Vorschau:
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_god_tools.xml b/indra/newview/skins/default/xui/de/floater_god_tools.xml
index 716165bb6b..30b151ca58 100644
--- a/indra/newview/skins/default/xui/de/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/de/floater_god_tools.xml
@@ -11,15 +11,15 @@
</text>
<check_box label="Startbereich Einleitung" name="check prelude" tool_tip="Diese Region zu einem Startbereich machen."/>
<check_box label="Sonne fest" name="check fixed sun" tool_tip="Fixiert den Sonnenstand (wie in „Region/Grundstück“ &gt; „Terrain“."/>
- <check_box height="32" label="Zuhause auf Teleport zurücksetzen" name="check reset home" tool_tip="Wenn Einwohner weg teleportieren, ihr Zuhause auf Zielposition setzen."/>
- <check_box bottom_delta="-32" label="Sichtbar" name="check visible" tool_tip="Diese Region für Nicht-Götter sichtbar machen."/>
+ <check_box label="Zuhause auf Teleport zurücksetzen" name="check reset home" tool_tip="Wenn Einwohner weg teleportieren, ihr Zuhause auf Zielposition setzen."/>
+ <check_box label="Sichtbar" name="check visible" tool_tip="Diese Region für Nicht-Götter sichtbar machen."/>
<check_box label="Schaden" name="check damage" tool_tip="Schaden in dieser Region aktivieren."/>
<check_box label="Trafficüberwachung blockieren" name="block dwell" tool_tip="In dieser Region die Traffic-Berechnung abschalten."/>
<check_box label="Terraformen blockieren" name="block terraform" tool_tip="Das Terraformen von Land verbieten (Benutzen Sie dies um Leuten das Terraformen ihres Landes zu verbieten)"/>
<check_box label="Sandkasten" name="is sandbox" tool_tip="Sandkastenregion ein-/ausschalten."/>
- <button label="Terrain formen" label_selected="Terrain formen" name="Bake Terrain" tool_tip="Das aktuelle Terrain als Standard speichern." width="118"/>
- <button label="Terrain zurücksetzen" label_selected="Terrain zurücksetzen" name="Revert Terrain" tool_tip="Das aktuelle Terrain mit dem Standard ersetzen." width="118"/>
- <button label="Terrain tauschen" label_selected="Terrain tauschen" name="Swap Terrain" tool_tip="Aktuelles Terrain gegen Standard austauschen." width="118"/>
+ <button label="Terrain formen" label_selected="Terrain formen" name="Bake Terrain" tool_tip="Das aktuelle Terrain als Standard speichern." width="120"/>
+ <button label="Terrain zurücksetzen" label_selected="Terrain zurücksetzen" name="Revert Terrain" tool_tip="Das aktuelle Terrain mit dem Standard ersetzen." width="120"/>
+ <button label="Terrain tauschen" label_selected="Terrain tauschen" name="Swap Terrain" tool_tip="Aktuelles Terrain gegen Standard austauschen." width="120"/>
<text name="estate id">
Grundstücks-ID:
</text>
@@ -32,11 +32,11 @@
</text>
<line_editor left_delta="110" name="gridposx" tool_tip="Die X-Rasterposition dieser Region" width="35"/>
<line_editor left_delta="45" name="gridposy" tool_tip="Die Y-Rasterposition dieser Region" width="35"/>
- <text name="Redirect to Grid: ">
+ <text name="Redirect to Grid: " width="110">
Auf Raster umleiten:
</text>
- <line_editor left_delta="110" name="redirectx" width="35"/>
- <line_editor left_delta="45" name="redirecty" width="35"/>
+ <line_editor left_delta="110" name="redirectx" width="35" left_pad="0"/>
+ <line_editor left_delta="45" name="redirecty" width="35" />
<text font="SansSerifSmall" name="billable factor text">
Abrechnungsfaktor:
</text>
@@ -45,8 +45,8 @@
</text>
<button label="Aktualisieren" label_selected="Aktualisieren" name="Refresh" tool_tip="Klicken Sie hier, um die obigen Informationen zu aktualisieren."/>
<button label="Übernehmen" label_selected="Übernehmen" name="Apply" tool_tip="Klicken Sie hier, um die obigen Änderungen zu übernehmen."/>
- <button label="Region auswählen" label_selected="Region auswählen" left="136" name="Select Region" tool_tip="Die gesamte Region mit dem Landwerkzeug auswählen." width="130"/>
- <button label="Automatisch speichern" label_selected="Automatisch speichern" left="136" name="Autosave now" tool_tip="gzipped-Status im Autosave-Verzeichnis speichern." width="130"/>
+ <button label="Region auswählen" label_selected="Region auswählen" left="136" name="Select Region" tool_tip="Die gesamte Region mit dem Landwerkzeug auswählen." width="132"/>
+ <button label="Automatisch speichern" label_selected="Automatisch speichern" left="136" name="Autosave now" tool_tip="gzipped-Status im Autosave-Verzeichnis speichern." width="132"/>
</panel>
<panel label="Objekte" name="objects">
<panel.string name="no_target">
diff --git a/indra/newview/skins/default/xui/de/floater_image_preview.xml b/indra/newview/skins/default/xui/de/floater_image_preview.xml
index 7f66234dab..fd675f8808 100644
--- a/indra/newview/skins/default/xui/de/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/de/floater_image_preview.xml
@@ -28,5 +28,5 @@ Speichern Sie das Bild als 24 Bit Targa (.tga).
</text>
<check_box label="Verlustfreie Komprimierung verwenden" name="lossless_check"/>
<button label="Abbrechen" name="cancel_btn"/>
- <button label="Hochladen ([AMOUNT] L$)" name="ok_btn"/>
+ <button label="Hochladen ([AMOUNT] L$)" name="ok_btn" width="146"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_inspect.xml b/indra/newview/skins/default/xui/de/floater_inspect.xml
index 939aa964c0..da97ceb2d8 100644
--- a/indra/newview/skins/default/xui/de/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/de/floater_inspect.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater min_width="450" name="inspect" title="OBJEKTE UNTERSUCHEN">
+<floater min_width="460" name="inspect" title="OBJEKTE UNTERSUCHEN" width="460">
<floater.string name="timeStamp">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</floater.string>
<scroll_list name="object_list" tool_tip="Wählen Sie ein Objekt aus dieser Liste, um es in der Second Life-Welt zu markieren">
<scroll_list.columns label="Objektname" name="object_name"/>
- <scroll_list.columns label="Besitzer" name="owner_name"/>
+ <scroll_list.columns label="Besitzer" name="owner_name" />
<scroll_list.columns label="Ersteller" name="creator_name"/>
- <scroll_list.columns label="Erstellungsdatum" name="creation_date"/>
+ <scroll_list.columns label="Erstellungsdatum" name="creation_date" width="116"/>
</scroll_list>
<button label="Besitzerprofil einsehen..." name="button owner" tool_tip="Profil des Besitzers des markierten Objekts einsehen" width="155"/>
<button label="Erstellerprofil einsehen..." left="175" name="button creator" tool_tip="Profil des ursprünglichen Erstellers des markierten Objekts einsehen" width="155"/>
diff --git a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
index e894f666c9..f98e23bbc4 100644
--- a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
@@ -59,10 +59,10 @@
Nächster Eigentümer:
</text>
<check_box label="Bearbeiten" name="CheckNextOwnerModify"/>
- <check_box label="Kopieren" left_delta="85" name="CheckNextOwnerCopy"/>
+ <check_box label="Kopieren" left_delta="55" name="CheckNextOwnerCopy"/>
<check_box label="Wiederverkaufen" name="CheckNextOwnerTransfer"/>
<check_box label="Zum Verkauf" name="CheckPurchase"/>
- <combo_box name="combobox sale copy">
+ <combo_box name="combobox sale copy" left_pad="25">
<combo_box.item label="Kopieren" name="Copy"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
diff --git a/indra/newview/skins/default/xui/de/floater_lsl_guide.xml b/indra/newview/skins/default/xui/de/floater_lsl_guide.xml
index 1d6f690d3c..73c21edc67 100644
--- a/indra/newview/skins/default/xui/de/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/de/floater_lsl_guide.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="script ed float" title="LSL-REFERENZ">
<check_box label="Cursor folgen" name="lock_check"/>
- <combo_box label="Sperren" name="history_combo"/>
+ <combo_box label="Sperren" name="history_combo" left_pad="50" width="80"/>
<button label="Zurück" name="back_btn"/>
<button label="Weiter" name="fwd_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_media_browser.xml b/indra/newview/skins/default/xui/de/floater_media_browser.xml
index 18adb5ee7f..2d438dfe21 100644
--- a/indra/newview/skins/default/xui/de/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/de/floater_media_browser.xml
@@ -14,8 +14,8 @@
<button label="Los" name="go"/>
</layout_panel>
<layout_panel name="time_controls">
- <button label="zurückspulen" name="rewind"/>
- <button label="anhalten" name="stop"/>
+ <button label="zurückspulen" name="rewind" width="100"/>
+ <button label="anhalten" name="stop" left_pad="20"/>
<button label="vorwärts" name="seek"/>
</layout_panel>
<layout_panel name="parcel_owner_controls">
diff --git a/indra/newview/skins/default/xui/de/floater_mem_leaking.xml b/indra/newview/skins/default/xui/de/floater_mem_leaking.xml
index b730146aa6..fdc9b950b6 100644
--- a/indra/newview/skins/default/xui/de/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/de/floater_mem_leaking.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="MemLeak" title="SPEICHERVERLUST SIMULIEREN">
- <spinner label="Verlustgeschwindigkeit (Bytes pro Frame):" name="leak_speed"/>
- <spinner label="Max. Speicherverlust (MB):" name="max_leak"/>
+ <spinner label="Verlustgeschwindigkeit (Bytes pro Frame):" name="leak_speed" label_width="224"/>
+ <spinner label="Max. Speicherverlust (MB):" name="max_leak" label_width="224"/>
<text name="total_leaked_label">
Aktueller Speicherverlust:[SIZE] KB
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_openobject.xml b/indra/newview/skins/default/xui/de/floater_openobject.xml
index f0b6aa498b..c3e7052283 100644
--- a/indra/newview/skins/default/xui/de/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/de/floater_openobject.xml
@@ -3,6 +3,6 @@
<text name="object_name">
[DESC]:
</text>
- <button label="In Inventar kopieren" label_selected="In Inventar kopieren" name="copy_to_inventory_button" width="132"/>
- <button label="Kopieren und anziehen" label_selected="Kopieren und anziehen" left="150" name="copy_and_wear_button" width="132"/>
+ <button label="In Inventar kopieren" label_selected="In Inventar kopieren" name="copy_to_inventory_button" width="120"/>
+ <button label="Kopieren und anziehen" label_selected="Kopieren und anziehen" left_pad="6" name="copy_and_wear_button" width="136"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_pay_object.xml b/indra/newview/skins/default/xui/de/floater_pay_object.xml
index 92f5ea415e..bc714361cc 100644
--- a/indra/newview/skins/default/xui/de/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/de/floater_pay_object.xml
@@ -17,10 +17,10 @@
<text left="105" name="object_name_text">
...
</text>
- <button label="1 L$" label_selected="1 L$" left="105" name="fastpay 1"/>
- <button label="5 L$" label_selected="5 L$" left="190" name="fastpay 5"/>
- <button label="10 L$" label_selected="10 L$" left="105" name="fastpay 10"/>
- <button label="20 L$" label_selected="20 L$" left="190" name="fastpay 20"/>
+ <button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
+ <button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
+ <button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
+ <button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
<text name="amount text">
Oder Betrag auswählen:
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_postcard.xml b/indra/newview/skins/default/xui/de/floater_postcard.xml
index 37a0a0ad1d..91e0bb8133 100644
--- a/indra/newview/skins/default/xui/de/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/de/floater_postcard.xml
@@ -3,19 +3,19 @@
<text name="to_label">
E-Mail des Empfängers:
</text>
- <line_editor left="145" name="to_form" width="125"/>
+ <line_editor left_delta="145" name="to_form" width="125"/>
<text name="from_label">
Ihre E-Mail:
</text>
- <line_editor left="145" name="from_form" width="125"/>
+ <line_editor left_delta="145" name="from_form" width="125"/>
<text name="name_label">
Ihr Name:
</text>
- <line_editor left="145" name="name_form" width="125"/>
+ <line_editor left_delta="145" name="name_form" width="125"/>
<text name="subject_label">
Betreff:
</text>
- <line_editor label="Betreff hier eingeben." left="145" name="subject_form" width="125"/>
+ <line_editor label="Betreff hier eingeben." left_delta="145" name="subject_form" width="125"/>
<text name="msg_label">
Nachricht:
</text>
@@ -25,7 +25,7 @@
<check_box label="Im Web veröffentlichen" name="allow_publish_check" tool_tip="Veröffentlicht diese Postkarte im Web."/>
<check_box label="Ab-18-Inhalt" name="mature_check" tool_tip="Diese Postkarte enthält nicht jugendfreie Inhalte."/>
<button label="?" name="publish_help_btn"/>
- <text name="fine_print">
+ <text name="fine_print" bottom_delta="21" height="140">
Wenn sich der Empfänger bei SL anmeldet, erhalten Sie einen Empfehlungsbonus.
</text>
<button label="Abbrechen" name="cancel_btn"/>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_animation.xml b/indra/newview/skins/default/xui/de/floater_preview_animation.xml
index e98faeb1f4..b2e9c2e66d 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_animation.xml
@@ -3,10 +3,10 @@
<floater.string name="Title">
Animation: [NAME]
</floater.string>
- <text name="desc txt">
+ <text name="desc txt" width="140">
Beschreibung:
</text>
- <line_editor left="98" name="desc" width="189"/>
+ <line_editor left="108" name="desc" width="160"/>
<button label="In Welt abspielen" label_selected="Stopp" name="Anim play btn" tool_tip="Diese Animation so wiedergeben, dass andere sie sehen können." width="116"/>
<button label="Lokal wiedergeben" label_selected="Stopp" left="171" name="Anim audition btn" tool_tip="Diese Animation so wiedergeben, dass nur Sie sie sehen." width="116"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
index 51c41a3209..1426a33d1d 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
@@ -36,7 +36,7 @@
<text name="replace_text" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht&apos;s“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht&apos;s sagen“ und die zugehörige Geste wird abgespielt.">
Ersetzen mit:
</text>
- <line_editor name="replace_editor" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht&apos;s“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht&apos;s sagen“ und die zugehörige Geste wird abgespielt."/>
+ <line_editor name="replace_editor" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht&apos;s“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht&apos;s sagen“ und die zugehörige Geste wird abgespielt." left_delta="94" width="160"/>
<text name="key_label">
Tastenkürzel:
</text>
@@ -45,8 +45,8 @@
<text name="library_label">
Bibliothek:
</text>
- <scroll_list name="library_list"/>
- <button label="Hinzufügen &gt;&gt;" name="add_btn"/>
+ <scroll_list name="library_list" width="166"/>
+ <button label="Hinzufügen &gt;&gt;" name="add_btn" left_pad="6" width="94"/>
<text name="steps_label">
Schritte:
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_report_abuse.xml b/indra/newview/skins/default/xui/de/floater_report_abuse.xml
index 3edf5959a2..f471866967 100644
--- a/indra/newview/skins/default/xui/de/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/de/floater_report_abuse.xml
@@ -23,7 +23,8 @@
{128.1, 128.1, 15.4}
</text>
<text bottom_delta="-38" height="32" name="select_object_label">
- Klicken Sie auf die Schaltfläche, dann auf das entsprechende Objekt:
+ Klicken Sie auf die Schaltfläche, dann auf das entsprechende
+Objekt:
</text>
<button label="" label_selected="" name="pick_btn" tool_tip="Objektauswahl – Wählen Sie ein Objekt als Thema dieses Berichts aus"/>
<text name="object_name_label">
@@ -95,7 +96,7 @@
<text name="bug_aviso">
Bitte beschreiben Sie alles so genau wie möglich.
</text>
- <text_editor bottom_delta="-136" height="130" name="details_edit"/>
+ <text_editor bottom_delta="-136" height="70" name="details_edit"/>
<text bottom_delta="-20" name="incomplete_title">
* Unvollständige Berichte werden nicht bearbeitet
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_script_preview.xml b/indra/newview/skins/default/xui/de/floater_script_preview.xml
index 27c40aff07..1ea3803aea 100644
--- a/indra/newview/skins/default/xui/de/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/de/floater_script_preview.xml
@@ -3,7 +3,7 @@
<floater.string name="Title">
Skript: [NAME]
</floater.string>
- <text name="desc txt">
+ <text name="desc txt" width="120">
Beschreibung:
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_sell_land.xml b/indra/newview/skins/default/xui/de/floater_sell_land.xml
index 2bc7356e65..a2c86e7bb0 100644
--- a/indra/newview/skins/default/xui/de/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_sell_land.xml
@@ -5,13 +5,13 @@
<text name="info_parcel_label">
Parzelle:
</text>
- <text bottom_delta="-5" height="16" name="info_parcel">
+ <text bottom_delta="-5" height="16" name="info_parcel" left="70">
PARZELLENNAME
</text>
<text name="info_size_label">
Größe:
</text>
- <text bottom_delta="-21" height="32" name="info_size">
+ <text bottom_delta="-21" height="32" name="info_size" left="70">
[AREA] m².
</text>
<text bottom_delta="-57" height="28" name="info_action">
@@ -20,7 +20,7 @@
<text name="price_label">
1. Preis festlegen:
</text>
- <text name="price_text">
+ <text name="price_text" >
Einen angemessenen Preis auswählen.
</text>
<text name="price_ld">
diff --git a/indra/newview/skins/default/xui/de/floater_snapshot.xml b/indra/newview/skins/default/xui/de/floater_snapshot.xml
index 80573d69ad..b48c9a77c8 100644
--- a/indra/newview/skins/default/xui/de/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/de/floater_snapshot.xml
@@ -60,7 +60,7 @@
<spinner label="Höhe" name="snapshot_height"/>
<check_box label="Seitenverhältnis beibehalten" name="keep_aspect_check"/>
<slider label="Bildqualität" name="image_quality_slider"/>
- <text name="layer_type_label" width="63">
+ <text name="layer_type_label" width="66">
Aufnehmen:
</text>
<combo_box label="Bildlayer" left="73" name="layer_types" width="132">
diff --git a/indra/newview/skins/default/xui/de/floater_stats.xml b/indra/newview/skins/default/xui/de/floater_stats.xml
index dcea484e13..1eb2dd4288 100644
--- a/indra/newview/skins/default/xui/de/floater_stats.xml
+++ b/indra/newview/skins/default/xui/de/floater_stats.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Statistics" title="STATISTIKEN">
- <scroll_container name="statistics_scroll">
- <container_view name="statistics_view">
+<floater name="Statistics" title="STATISTIKEN" width="280">
+ <scroll_container name="statistics_scroll" width="280">
+ <container_view name="statistics_view" width="280">
<stat_view label="Basic" name="basic">
<stat_bar label="FPS" name="fps"/>
<stat_bar label="Bandbreite" name="bandwidth"/>
diff --git a/indra/newview/skins/default/xui/de/floater_telehub.xml b/indra/newview/skins/default/xui/de/floater_telehub.xml
index 923b4c0079..4d3c96bc87 100644
--- a/indra/newview/skins/default/xui/de/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/de/floater_telehub.xml
@@ -6,15 +6,15 @@
<text name="status_text_not_connected">
Kein Telehub verbunden.
</text>
- <text name="help_text_connected">
+ <text name="help_text_connected" width="300">
Klicken Sie zum Entfernen auf „Trennen“.
</text>
<text bottom_delta="-18" height="38" name="help_text_not_connected">
Wählen Sie ein Objekt und klicken Sie auf
„Mit Telehub verbinden“.
</text>
- <button label="Mit Telehub verbinden" name="connect_btn" width="122"/>
- <button label="Trennen" left="142" name="disconnect_btn" width="98"/>
+ <button label="Mit Telehub verbinden" name="connect_btn" width="134"/>
+ <button label="Trennen" left="152" name="disconnect_btn" width="88"/>
<text name="spawn_points_text" width="230">
Spawn-Punkte (Positionen, nicht Objekte):
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml
index b2f8cbed45..b5c02cce0b 100644
--- a/indra/newview/skins/default/xui/de/floater_tools.xml
+++ b/indra/newview/skins/default/xui/de/floater_tools.xml
@@ -363,7 +363,7 @@
<text name="edit_object">
Objekteigenschaften bearbeiten:
</text>
- <check_box label="Flexibler Weg" name="Flexible1D Checkbox Ctrl" tool_tip="Bewirkt, dass sich das Objekt um die Z-Achse biegen kann. (Nur Client-Seite)"/>
+ <check_box label="Flexibler Pfad" name="Flexible1D Checkbox Ctrl" tool_tip="Bewirkt, dass sich das Objekt um die Z-Achse biegen kann. (Nur Client-Seite)"/>
<spinner label="Weichheit" name="FlexNumSections"/>
<spinner label="Schwerkraft" name="FlexGravity"/>
<spinner label="Ziehen" name="FlexFriction"/>
diff --git a/indra/newview/skins/default/xui/de/floater_url_entry.xml b/indra/newview/skins/default/xui/de/floater_url_entry.xml
index 392d53a33d..f5fa449c85 100644
--- a/indra/newview/skins/default/xui/de/floater_url_entry.xml
+++ b/indra/newview/skins/default/xui/de/floater_url_entry.xml
@@ -3,10 +3,10 @@
<text name="media_label">
Medien-URL:
</text>
- <button label="OK" name="ok_btn" />
- <button label="Abbrechen" name="cancel_btn" width="75" />
- <button label="Löschen" name="clear_btn" />
- <text name="loading_label">
+ <button label="OK" name="ok_btn" width="30"/>
+ <button label="Abbrechen" name="cancel_btn" width="66" />
+ <button label="Löschen" name="clear_btn" left_pad="100"/>
+ <text name="loading_label" left="120">
Wird geladen...
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_water.xml b/indra/newview/skins/default/xui/de/floater_water.xml
index ed18dfdfff..ecd6d7ff3e 100644
--- a/indra/newview/skins/default/xui/de/floater_water.xml
+++ b/indra/newview/skins/default/xui/de/floater_water.xml
@@ -3,7 +3,7 @@
<floater.string name="WLDefaultWaterNames">
Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
</floater.string>
- <text name="KeyFramePresetsText">
+ <text name="KeyFramePresetsText" width="116">
Voreinstellungen:
</text>
<button label="Neu" label_selected="Neu" name="WaterNewPreset"/>
diff --git a/indra/newview/skins/default/xui/de/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/de/floater_whitelist_entry.xml
index 35a5ec35f7..1332509529 100644
--- a/indra/newview/skins/default/xui/de/floater_whitelist_entry.xml
+++ b/indra/newview/skins/default/xui/de/floater_whitelist_entry.xml
@@ -5,5 +5,5 @@
</text>
<line_editor name="whitelist_entry" tool_tip="Eine URL oder URL-Patten in die Whitelist eingeben"/>
<button label="OK" name="ok_btn"/>
- <button label="Abbrechen" name="cancel_btn"/>
+ <button label="Abbrechen" name="cancel_btn" width="80"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/inspect_avatar.xml b/indra/newview/skins/default/xui/de/inspect_avatar.xml
index 489e257867..eedbdc9904 100644
--- a/indra/newview/skins/default/xui/de/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/de/inspect_avatar.xml
@@ -16,9 +16,9 @@
Dies ist meine Beschreibung und ich finde sie wirklich gut!
</text>
<slider name="volume_slider" tool_tip="Lautstärke" value="0.5"/>
- <button label="Freund hinzufügen" name="add_friend_btn"/>
+ <button label="Freund hinzufügen" name="add_friend_btn" width="110"/>
<button label="IM" name="im_btn"/>
- <button label="Mehr" name="view_profile_btn"/>
+ <button label="Mehr" name="view_profile_btn" width="44" left_delta="120"/>
<panel name="moderator_panel">
<button label="Voice deaktivieren" name="disable_voice"/>
<button label="Voice aktivieren" name="enable_voice"/>
diff --git a/indra/newview/skins/default/xui/de/inspect_group.xml b/indra/newview/skins/default/xui/de/inspect_group.xml
index 81d946be9d..badb47bf08 100644
--- a/indra/newview/skins/default/xui/de/inspect_group.xml
+++ b/indra/newview/skins/default/xui/de/inspect_group.xml
@@ -24,7 +24,7 @@
</text>
<text name="group_details">
Eine Gruppe für Leute, die sich gerne mit Elchen unterhält.
-Hoch solln sie leben! Elche forever! Und auch Mungos!
+Hoch solln sie leben! Elche forever! Und auch Mungos!
</text>
<text name="group_cost">
Mitgliedschaft: 123 L$
diff --git a/indra/newview/skins/default/xui/de/inspect_object.xml b/indra/newview/skins/default/xui/de/inspect_object.xml
index 61f2cc8dc9..bcf4b91527 100644
--- a/indra/newview/skins/default/xui/de/inspect_object.xml
+++ b/indra/newview/skins/default/xui/de/inspect_object.xml
@@ -39,7 +39,7 @@ Besitzer secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
</text>
<button label="Kaufen" name="buy_btn"/>
<button label="Zahlen" name="pay_btn"/>
- <button label="Kopie nehmen" name="take_free_copy_btn"/>
+ <button label="Kopie nehmen" name="take_free_copy_btn" width="100"/>
<button label="Berühren" name="touch_btn"/>
<button label="Sitzen" name="sit_btn"/>
<button label="Öffnen" name="open_btn"/>
diff --git a/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml
index eb4832770e..eeb5de749d 100644
--- a/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml
+++ b/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="block_list_panel">
- <text name="title_text">
+<panel name="block_list_panel" width="300">
+ <text name="title_text" left_pad="5" width="260">
Liste der ignorierten Einwohner
</text>
- <scroll_list name="blocked" tool_tip="Liste der zur Zeit ignorierten Einwohner"/>
+ <scroll_list name="blocked" tool_tip="Liste der zur Zeit ignorierten Einwohner" width="290"/>
<button label="Einwohner ignorieren" label_selected="Einwohner ignorieren..." name="Block resident..." tool_tip="Wählen Sie einen Einwohner, um ihn zu ignorieren"/>
<button label="Objekt nach Name ignorieren" label_selected="Objekt nach Name ignorieren..." name="Block object by name..." tool_tip="Ein Objekt auswählen, um nach Namen zu ignorieren."/>
<button label="Freischalten" label_selected="Freischalten" name="Unblock" tool_tip="Einwohner oder Objekt von der Liste der ignorierten Einwohner oder Objekte entfernen"/>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_alpha.xml b/indra/newview/skins/default/xui/de/panel_edit_alpha.xml
index 4b48950341..b6c53be778 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_alpha.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="edit_alpha_panel">
- <panel name="avatar_alpha_color_panel">
- <texture_picker label="Alpha: Unten" name="Lower Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Alpha: Oben" name="Upper Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+<panel name="edit_alpha_panel" width="320">
+ <panel name="avatar_alpha_color_panel" width="300">
+ <texture_picker label="Alpha: Unten" name="Lower Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken" width="70"/>
+ <texture_picker label="Alpha: Oben" name="Upper Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken" width="66"/>
<texture_picker label="Kopf: Alpha" name="Head Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Alpha: Augen" name="Eye Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Alpha: Haare" name="Hair Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Alpha: Augen" name="Eye Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken" width="72"/>
+ <texture_picker label="Alpha: Haare" name="Hair Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken" width="70"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/de/panel_edit_tattoo.xml
index c05a3a6645..12649e9251 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_tattoo.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_tattoo.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_tattoo_panel">
<panel name="avatar_tattoo_color_panel">
- <texture_picker label="Kopftattoo" name="Head Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Obere Tattoos" name="Upper Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Untere Tattoos" name="Lower Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Kopftattoo" name="Head Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken" width="80"/>
+ <texture_picker label="Obere Tattoos" name="Upper Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken" width="80"/>
+ <texture_picker label="Untere Tattoos" name="Lower Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken" width="80"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_group_invite.xml b/indra/newview/skins/default/xui/de/panel_group_invite.xml
index 8e1fb5e4b2..fb357093bb 100644
--- a/indra/newview/skins/default/xui/de/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_invite.xml
@@ -9,18 +9,18 @@
<panel.string name="already_in_group">
Einige der ausgewählten Einwohner sind bereits Gruppenmitglieder und haben aus diesem Grund keine Einladung erhalten.
</panel.string>
- <text name="help_text">
+ <text name="help_text" top="10">
Sie können mehrere Einwohner auswählen, um diese in Ihre Gruppe einzuladen. Klicken Sie hierzu auf „Einwohnerliste öffnen“.
</text>
- <button label="Einwohnerliste öffnen" name="add_button" tool_tip=""/>
+ <button label="Einwohnerliste öffnen" name="add_button" tool_tip="" top_delta="62"/>
<name_list name="invitee_list" tool_tip="Halten Sie zur Mehrfachauswahl die Strg-Taste gedrückt und klicken Sie auf die Namen."/>
<button label="Auswahl aus Liste löschen" name="remove_button" tool_tip="Die oben ausgewählten Einwohner von der Einladungsliste entfernen."/>
<text name="role_text">
Wählen Sie eine Rolle aus:
</text>
<combo_box name="role_name" tool_tip="Wählen Sie aus der Liste der Rollen, die Sie an Mitglieder vergeben dürfen."/>
- <button label="Einladungen versenden" name="ok_button"/>
- <button label="Abbrechen" name="cancel_button"/>
+ <button label="Einladungen versenden" name="ok_button" width="136"/>
+ <button label="Abbrechen" name="cancel_button" width="66"/>
<string name="GroupInvitation">
Gruppeneinladung
</string>
diff --git a/indra/newview/skins/default/xui/de/panel_group_land_money.xml b/indra/newview/skins/default/xui/de/panel_group_land_money.xml
index e9743c5d5d..d6cfb22cfe 100644
--- a/indra/newview/skins/default/xui/de/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_land_money.xml
@@ -30,13 +30,13 @@
<text name="total_contributed_land_value">
[AREA] m².
</text>
- <text name="total_land_in_use_label">
+ <text name="total_land_in_use_label" left="28" width="180">
Insgesamt verwendetes Land:
</text>
<text name="total_land_in_use_value">
[AREA] m².
</text>
- <text name="land_available_label">
+ <text name="land_available_label" left="4">
Land verfügbar:
</text>
<text name="land_available_value">
@@ -54,10 +54,10 @@
<text name="your_contribution_max_value">
([AMOUNT] max.)
</text>
- <text name="group_over_limit_text">
+ <text name="group_over_limit_text" width="300">
Um das benutzte Land zu unterstützen, sind weitere Landnutzungsrechte erforderlich.
</text>
- <text name="group_money_heading">
+ <text name="group_money_heading" left="10" top_pad="10">
Gruppen-L$
</text>
<tab_container name="group_money_tab_container">
diff --git a/indra/newview/skins/default/xui/de/panel_group_roles.xml b/indra/newview/skins/default/xui/de/panel_group_roles.xml
index 3103fd65b1..b2e885e639 100644
--- a/indra/newview/skins/default/xui/de/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_roles.xml
@@ -15,8 +15,8 @@ um mehrere Mitglieder auszuwählen.
</panel.string>
<filter_editor label="Mitglieder filtern" name="filter_input"/>
<name_list name="member_list">
- <name_list.columns label="Mitglied" name="name"/>
- <name_list.columns label="Ãœbereignung" name="donated"/>
+ <name_list.columns label="Mitglied" name="name" relative_width="0.30"/>
+ <name_list.columns label="Ãœbereignung" name="donated" relative_width="0.33"/>
<name_list.columns label="Status" name="online"/>
</name_list>
<button label="Einladen" name="member_invite"/>
diff --git a/indra/newview/skins/default/xui/de/panel_groups.xml b/indra/newview/skins/default/xui/de/panel_groups.xml
index 95a2ef14f9..f857a6c7ac 100644
--- a/indra/newview/skins/default/xui/de/panel_groups.xml
+++ b/indra/newview/skins/default/xui/de/panel_groups.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="groups">
- <text name="groupdesc">
+ <text name="groupdesc" width="300">
Die derzeit aktive Gruppe ist fett hervorgehoben.
</text>
- <text name="groupcount">
+ <text name="groupcount" width="360">
Sie sind Mitglied bei [COUNT] Gruppen (von max. [MAX]).
</text>
<button label="IM/Anruf" name="IM" tool_tip="Beginnt eine Instant Message-Sitzung" />
diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml
index bd82fc6872..2a6ea42c73 100644
--- a/indra/newview/skins/default/xui/de/panel_login.xml
+++ b/indra/newview/skins/default/xui/de/panel_login.xml
@@ -23,7 +23,7 @@
<text name="start_location_text">
Hier anfangen:
</text>
- <combo_box name="start_location_combo">
+ <combo_box name="start_location_combo" width="150">
<combo_box.item label="Mein letzter Standort" name="MyLastLocation"/>
<combo_box.item label="Mein Zuhause" name="MyHome"/>
<combo_box.item label="&lt;Region eingeben&gt;" name="Typeregionname"/>
diff --git a/indra/newview/skins/default/xui/de/panel_media_settings_security.xml b/indra/newview/skins/default/xui/de/panel_media_settings_security.xml
index 8ff013f66b..adc0d22ce6 100644
--- a/indra/newview/skins/default/xui/de/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/de/panel_media_settings_security.xml
@@ -2,7 +2,8 @@
<panel label="Sicherheit" name="Media Settings Security">
<check_box initial_value="false" label="Nur Zugriff auf festgelegte URL-Muster zulassen" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
- Einträge, die für die Startseite nicht akzeptiert werden, sind markiert:
+ Einträge, die für die Startseite nicht akzeptiert
+werden, sind markiert:
</text>
<button label="Hinzufügen" name="whitelist_add"/>
<button label="Löschen" name="whitelist_del"/>
diff --git a/indra/newview/skins/default/xui/de/panel_nearby_chat.xml b/indra/newview/skins/default/xui/de/panel_nearby_chat.xml
index 699bddc6eb..3f4f5a71b5 100644
--- a/indra/newview/skins/default/xui/de/panel_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/de/panel_nearby_chat.xml
@@ -2,7 +2,7 @@
<!-- All our XML is utf-8 encoded. -->
<panel name="nearby_chat">
<panel name="chat_caption">
- <text name="sender_name">
+ <text name="sender_name" width="200">
CHAT IN DER NÄHE
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_notes.xml b/indra/newview/skins/default/xui/de/panel_notes.xml
index e6a63fc0c8..374c117cdd 100644
--- a/indra/newview/skins/default/xui/de/panel_notes.xml
+++ b/indra/newview/skins/default/xui/de/panel_notes.xml
@@ -13,10 +13,10 @@
</scroll_container>
</layout_panel>
<layout_panel name="notes_buttons_panel">
- <button label="Freund hinzufügen" name="add_friend" tool_tip="Bieten Sie dem Einwohner die Freundschaft an"/>
- <button label="IM" name="im" tool_tip="Instant Messenger öffnen"/>
+ <button label="Freund hinzufügen" name="add_friend" tool_tip="Bieten Sie dem Einwohner die Freundschaft an" width="109"/>
+ <button label="IM" name="im" tool_tip="Instant Messenger öffnen" width="24"/>
<button label="Anrufen" name="call" tool_tip="Diesen Einwohner anrufen"/>
- <button label="Karte" name="show_on_map_btn" tool_tip="Einwohner auf Karte anzeigen"/>
+ <button label="Karte" name="show_on_map_btn" tool_tip="Einwohner auf Karte anzeigen" width="40"/>
<button label="Teleportieren" name="teleport" tool_tip="Teleport anbieten"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/de/panel_picks.xml b/indra/newview/skins/default/xui/de/panel_picks.xml
index a07bc170f6..df68381082 100644
--- a/indra/newview/skins/default/xui/de/panel_picks.xml
+++ b/indra/newview/skins/default/xui/de/panel_picks.xml
@@ -11,7 +11,7 @@
</panel>
<panel name="buttons_cucks">
<button label="Info" name="info_btn" tool_tip="Auswahl-Information anzeigen"/>
- <button label="Teleportieren" name="teleport_btn" tool_tip="Zu entsprechendem Standort teleportieren"/>
+ <button label="Teleportieren" name="teleport_btn" tool_tip="Zu entsprechendem Standort teleportieren" width="100"/>
<button label="Karte" name="show_on_map_btn" tool_tip="Den entsprechenden Standort auf der Karte anzeigen"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_places.xml b/indra/newview/skins/default/xui/de/panel_places.xml
index 8ee26f4e5f..0b3ed26dce 100644
--- a/indra/newview/skins/default/xui/de/panel_places.xml
+++ b/indra/newview/skins/default/xui/de/panel_places.xml
@@ -5,11 +5,11 @@
<filter_editor label="Orte filtern" name="Filter"/>
<panel name="button_panel">
<button label="Teleportieren" name="teleport_btn" tool_tip="Zu ausgewähltem Standort teleportieren"/>
- <button label="Karte" name="map_btn"/>
+ <button label="Karte" name="map_btn" width="60"/>
<button label="Bearbeiten" name="edit_btn" tool_tip="Landmarken-Info bearbeiten"/>
<button name="overflow_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
<button label="Schließen" name="close_btn"/>
- <button label="Abbrechen" name="cancel_btn"/>
- <button label="Speichern" name="save_btn"/>
+ <button label="Abbrechen" name="cancel_btn" width="66"/>
+ <button label="Speichern" name="save_btn" width="66"/>
</panel>
</panel>
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 14d4e01586..c9d6faf3ba 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
@@ -8,7 +8,7 @@
</panel.string>
<check_box label="Blasen-Chat" name="bubble_text_chat"/>
<color_swatch name="background" tool_tip="Farbe für Blasen-Chat auswählen"/>
- <slider label="Deckkraft" name="bubble_chat_opacity"/>
+ <slider label="Deckkraft" name="bubble_chat_opacity" label_width="66"/>
<text name="AspectRatioLabel1" tool_tip="Breite/Höhe">
Seitenverhältnis
</text>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_general.xml b/indra/newview/skins/default/xui/de/panel_preferences_general.xml
index 490b0b296b..2af1b72472 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_general.xml
@@ -19,7 +19,7 @@
<text name="language_textbox2">
(Erfordert Neustart)
</text>
- <text name="maturity_desired_prompt">
+ <text name="maturity_desired_prompt" width="350">
Ich möchte auf Inhalt mit folgender Alterseinstufung zugreifen:
</text>
<text name="maturity_desired_textbox"/>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
index 0c0924026e..43664f4f8a 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
@@ -23,5 +23,5 @@
Speicherort für Protokolle:
</text>
<button label="Durchsuchen" label_selected="Durchsuchen" name="log_path_button"/>
- <button label="Ignorierte Einwohner/Objekte" name="block_list"/>
+ <button label="Ignorierte Einwohner/Objekte" name="block_list" width="180"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_profile.xml b/indra/newview/skins/default/xui/de/panel_profile.xml
index 82467eb570..4ce5ed8fba 100644
--- a/indra/newview/skins/default/xui/de/panel_profile.xml
+++ b/indra/newview/skins/default/xui/de/panel_profile.xml
@@ -38,10 +38,10 @@
</scroll_container>
</layout_panel>
<layout_panel name="profile_buttons_panel">
- <button label="Freund hinzufügen" name="add_friend" tool_tip="Bieten Sie dem Einwohner die Freundschaft an"/>
- <button label="IM" name="im" tool_tip="Instant Messenger öffnen"/>
+ <button label="Freund hinzufügen" name="add_friend" tool_tip="Bieten Sie dem Einwohner die Freundschaft an" width="109"/>
+ <button label="IM" name="im" tool_tip="Instant Messenger öffnen" width="24"/>
<button label="Anrufen" name="call" tool_tip="Diesen Einwohner anrufen"/>
- <button label="Karte" name="show_on_map_btn" tool_tip="Einwohner auf Karte anzeigen"/>
+ <button label="Karte" name="show_on_map_btn" tool_tip="Einwohner auf Karte anzeigen" width="36"/>
<button label="Teleportieren" name="teleport" tool_tip="Teleport anbieten"/>
</layout_panel>
<layout_panel name="profile_me_buttons_panel">
diff --git a/indra/newview/skins/default/xui/de/panel_profile_view.xml b/indra/newview/skins/default/xui/de/panel_profile_view.xml
index 4d59c16e98..f02457dd80 100644
--- a/indra/newview/skins/default/xui/de/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/de/panel_profile_view.xml
@@ -8,7 +8,7 @@
</string>
<text_editor name="user_name" value="(wird geladen...)"/>
<text name="status" value="Online"/>
- <tab_container name="tabs">
+ <tab_container name="tabs" tab_min_width="60">
<panel label="PROFIL" name="panel_profile"/>
<panel label="AUSWAHL" name="panel_picks"/>
<panel label="NOTIZEN &amp; PRIVATSPHÄRE" name="panel_notes"/>
diff --git a/indra/newview/skins/default/xui/de/panel_region_covenant.xml b/indra/newview/skins/default/xui/de/panel_region_covenant.xml
index 14be8def7e..153082909a 100644
--- a/indra/newview/skins/default/xui/de/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_covenant.xml
@@ -18,7 +18,7 @@
<text name="estate_cov_lbl">
Vertrag:
</text>
- <text name="covenant_timestamp_text">
+ <text name="covenant_timestamp_text" width="320">
Letzte Änderung am Mittwoch, den 31. Dez. 1969, 16:00:00
</text>
<button label="?" name="covenant_help"/>
@@ -28,7 +28,7 @@
<button label="Zurücksetzen" name="reset_covenant"/>
<text name="covenant_help_text">
Änderungen am Vertrag werden für alle Parzellen auf dem
- Grundstück übernommen.
+Grundstück übernommen.
</text>
<text bottom_delta="-36" name="covenant_instructions">
Ziehen Sie eine Notizkarte an diese Stelle, um den Vertrag für dieses Grundstück zu ändern.
@@ -63,7 +63,7 @@
<text name="changeable_lbl">
Unterteilen:
</text>
- <text name="changeable_clause">
+ <text name="changeable_clause" width="366">
Land in dieser Region kann nicht zusammengelegt/geteilt werden.
</text>
<string name="can_resell">
diff --git a/indra/newview/skins/default/xui/de/panel_region_debug.xml b/indra/newview/skins/default/xui/de/panel_region_debug.xml
index 40befab4dd..920a513308 100644
--- a/indra/newview/skins/default/xui/de/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_debug.xml
@@ -13,7 +13,7 @@
<check_box label="Physik deaktivieren" name="disable_physics_check" tool_tip="Physik in dieser Region deaktivieren"/>
<button label="?" name="disable_physics_help"/>
<button label="Ãœbernehmen" name="apply_btn"/>
- <text name="objret_text_lbl" width="105">
+ <text name="objret_text_lbl" width="110">
Objekt zurückgeben
</text>
<text name="resident_text_lbl">
diff --git a/indra/newview/skins/default/xui/de/panel_region_texture.xml b/indra/newview/skins/default/xui/de/panel_region_texture.xml
index d489b5bac8..f9997f300a 100644
--- a/indra/newview/skins/default/xui/de/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_texture.xml
@@ -36,14 +36,14 @@
<text name="height_text_lbl9">
Nordost
</text>
- <spinner label="Niedrig" name="height_start_spin_0"/>
- <spinner label="Niedrig" name="height_start_spin_1"/>
- <spinner label="Niedrig" name="height_start_spin_2"/>
- <spinner label="Niedrig" name="height_start_spin_3"/>
- <spinner label="Hoch" name="height_range_spin_0"/>
- <spinner label="Hoch" name="height_range_spin_1"/>
- <spinner label="Hoch" name="height_range_spin_2"/>
- <spinner label="Hoch" name="height_range_spin_3"/>
+ <spinner label="Niedrig" name="height_start_spin_0" label_width="40"/>
+ <spinner label="Niedrig" name="height_start_spin_1" label_width="40"/>
+ <spinner label="Niedrig" name="height_start_spin_2" label_width="40"/>
+ <spinner label="Niedrig" name="height_start_spin_3" label_width="40"/>
+ <spinner label="Hoch" name="height_range_spin_0" label_width="40"/>
+ <spinner label="Hoch" name="height_range_spin_1" label_width="40"/>
+ <spinner label="Hoch" name="height_range_spin_2" label_width="40"/>
+ <spinner label="Hoch" name="height_range_spin_3" label_width="40"/>
<text name="height_text_lbl10">
Diese Werte geben den Mischungsgrad für die obigen Texturen an.
</text>
diff --git a/indra/newview/skins/default/xui/de/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/de/panel_script_limits_my_avatar.xml
index f6a1d7e9b5..16bf4e8eb4 100644
--- a/indra/newview/skins/default/xui/de/panel_script_limits_my_avatar.xml
+++ b/indra/newview/skins/default/xui/de/panel_script_limits_my_avatar.xml
@@ -4,7 +4,7 @@
Wird geladen...
</text>
<scroll_list name="scripts_list">
- <scroll_list.columns label="Größe (KB)" name="size"/>
+ <scroll_list.columns label="Größe (KB)" name="size" width="80"/>
<scroll_list.columns label="URLs" name="urls"/>
<scroll_list.columns label="Objektname" name="name"/>
<scroll_list.columns label="Ort" name="location"/>
diff --git a/indra/newview/skins/default/xui/de/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/de/panel_script_limits_region_memory.xml
index c466c04e86..3eec66fe75 100644
--- a/indra/newview/skins/default/xui/de/panel_script_limits_region_memory.xml
+++ b/indra/newview/skins/default/xui/de/panel_script_limits_region_memory.xml
@@ -13,12 +13,12 @@
Wird geladen...
</text>
<scroll_list name="scripts_list">
- <scroll_list.columns label="Größe (KB)" name="size"/>
+ <scroll_list.columns label="Größe (KB)" name="size" width="80"/>
<scroll_list.columns label="Objektname" name="name"/>
- <scroll_list.columns label="Objekteigentümer" name="owner"/>
+ <scroll_list.columns label="Objekteigentümer" name="owner" width="130"/>
<scroll_list.columns label="Parzelle / Standort" name="location"/>
</scroll_list>
- <button label="Liste aktualisieren" name="refresh_list_btn"/>
+ <button label="Liste aktualisieren" name="refresh_list_btn" width="110"/>
<button label="Markieren" name="highlight_btn"/>
<button label="Zurückgeben" name="return_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_side_tray.xml b/indra/newview/skins/default/xui/de/panel_side_tray.xml
index 2cd11cdcef..446117962f 100644
--- a/indra/newview/skins/default/xui/de/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/de/panel_side_tray.xml
@@ -2,26 +2,26 @@
<!-- Side tray cannot show background because it is always
partially on screen to hold tab buttons. -->
<side_tray name="sidebar">
- <sidetray_tab description="Seitenleiste auf-/zuklappen." name="sidebar_openclose"/>
- <sidetray_tab description="Startseite." name="sidebar_home">
+ <sidetray_tab description="Seitenleiste auf-/zuklappen." name="sidebar_openclose" tab_title="Seitenleiste auf-/zuklappen"/>
+ <sidetray_tab description="Startseite." name="sidebar_home" tab_title="Startseite">
<panel label="Startseite" name="panel_home"/>
</sidetray_tab>
- <sidetray_tab description="Ihr öffentliches Profil und Auswahl bearbeiten." name="sidebar_me">
+ <sidetray_tab description="Ihr öffentliches Profil und Auswahl bearbeiten." name="sidebar_me" tab_title="Mein Profil">
<panel label="Ich" name="panel_me"/>
</sidetray_tab>
- <sidetray_tab description="Freunde, Kontakte und Leute in Ihrer Nähe finden." name="sidebar_people">
+ <sidetray_tab description="Freunde, Kontakte und Leute in Ihrer Nähe finden." name="sidebar_people" tab_title="Leute">
<panel_container name="panel_container">
<panel label="Gruppeninfo" name="panel_group_info_sidetray"/>
<panel label="Ignorierte Einwohner &amp; Objekte" name="panel_block_list_sidetray"/>
</panel_container>
</sidetray_tab>
- <sidetray_tab description="Hier finden Sie neue Orte und Orte, die Sie bereits besucht haben." label="Orte" name="sidebar_places">
+ <sidetray_tab description="Hier finden Sie neue Orte und Orte, die Sie bereits besucht haben." label="Orte" name="sidebar_places" tab_title="Orte">
<panel label="Orte" name="panel_places"/>
</sidetray_tab>
- <sidetray_tab description="Inventar durchsuchen." name="sidebar_inventory">
+ <sidetray_tab description="Inventar durchsuchen." name="sidebar_inventory" tab_title="Mein Inventar">
<panel label="Inventar bearbeiten" name="sidepanel_inventory"/>
</sidetray_tab>
- <sidetray_tab description="Ändern Sie Ihr Aussehen und Ihren aktuellen Look." name="sidebar_appearance">
+ <sidetray_tab description="Ändern Sie Ihr Aussehen und Ihren aktuellen Look." name="sidebar_appearance" tab_title="Mein Aussehen">
<panel label="Aussehen bearbeiten" name="sidepanel_appearance"/>
</sidetray_tab>
</side_tray>
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index bc67621dfd..25a3d6784f 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -144,17 +144,20 @@ It is a rare mind indeed that can render the hitherto non-existent blindingly ob
word_wrap="true">
3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
APR Copyright (C) 2000-2004 The Apache Software Foundation
+ Collada DOM Copyright 2005 Sony Computer Entertainment Inc.
cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
GL Copyright (C) 1999-2004 Brian Paul.
+ GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia.
google-perftools Copyright (c) 2005, Google Inc.
Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
ogg/vorbis Copyright (C) 2001, Xiphophorus
OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
+ PCRE Copyright (c) 1997-2008 University of Cambridge
Pth Copyright (C) 1999-2006 Ralf S. Engelschall &lt;rse@gnu.org&gt;
SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
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 61ca783d14..593bbe4b5e 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -369,7 +369,7 @@ Leyla Linden </text>
layout="topleft"
left_delta="0"
name="Sell with landowners objects in parcel."
- top_pad="-3"
+ top_pad="-2"
width="186">
Objects included in sale
</text>
@@ -1825,6 +1825,15 @@ Only large parcels can be listed in search.
top_delta="0"
right="-15"
select_on_focus="true" />
+ <check_box
+ height="16"
+ label="Hide URL"
+ layout="topleft"
+ name="hide_music_url"
+ tool_tip="Checking this option will hide the music url to any non-authorized viewers of this parcel information."
+ left_delta="10"
+ top_pad="5"
+ width="292" />
<text
type="string"
length="1"
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index a797d54749..2bd8420925 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -82,6 +82,8 @@
orientation="vertical"
tool_tip="Zoom camera toward focus"
top_pad="0"
+ min_val="0"
+ max_val="1"
width="18">
<commit_callback function="Slider.value_changed"/>
</slider_bar>
diff --git a/indra/newview/skins/default/xui/en/floater_event.xml b/indra/newview/skins/default/xui/en/floater_event.xml
new file mode 100644
index 0000000000..9ce0c9c86d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_event.xml
@@ -0,0 +1,243 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ follows="all"
+ height="350"
+ label="Event"
+ layout="topleft"
+ name="Event"
+ width="330">
+ <floater.string
+ name="none">
+ none
+ </floater.string>
+ <floater.string
+ name="notify">
+ Notify
+ </floater.string>
+ <floater.string
+ name="dont_notify">
+ Don&apos;t Notify
+ </floater.string>
+ <layout_stack
+ name="layout"
+ orientation="vertical"
+ follows="all"
+ layout="topleft"
+ left="0"
+ top="0"
+ height="350"
+ width="330"
+ border_size="0">
+ <layout_panel
+ name="profile_stack"
+ follows="all"
+ layout="topleft"
+ top="0"
+ left="0"
+ height="305"
+ width="330">
+ <text
+ follows="top|left|right"
+ font="SansSerifLarge"
+ text_color="white"
+ height="17"
+ layout="topleft"
+ left="10"
+ name="event_name"
+ top="5"
+ use_ellipses="true"
+ width="310">
+ Nameless Event...of Doom! De doom! Doom doom.
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ height="13"
+ text_color="LtGray_50"
+ layout="topleft"
+ left="25"
+ name="event_category"
+ width="300">
+ (no category)
+ </text>
+
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ layout="topleft"
+ left="10"
+ top_pad="7"
+ name="event_runby_label"
+ width="310">
+ Run by:
+ </text>
+ <text
+ follows="left|top"
+ height="20"
+ initial_value="(retrieving)"
+ layout="topleft"
+ left="10"
+ link="true"
+ name="event_runby"
+ top_pad="2"
+ use_ellipses="true"
+ width="310" />
+ <text
+ type="string"
+ length="1"
+ left="10"
+ height="17"
+ font="SansSerifMedium"
+ text_color="EmphasisColor"
+ top_pad="5"
+ follows="top|left"
+ layout="topleft"
+ name="event_date"
+ width="310">
+ 10/10/2010
+ </text>
+ <text
+ type="string"
+ height="14"
+ length="1"
+ left="10"
+ follows="top|left"
+ layout="topleft"
+ name="event_duration"
+ width="310">
+ 1 hour
+ </text>
+ <text
+ font="SansSerifMedium"
+ text_color="EmphasisColor"
+ type="string"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="event_cover"
+ visible="true"
+ width="310">
+ Free
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ layout="topleft"
+ left="10"
+ top_pad="5"
+ name="event_location_label">
+ Location:
+ </text>
+ <text
+ type="string"
+ length="1"
+ height="20"
+ left="10"
+ follows="top|left"
+ layout="topleft"
+ name="event_location"
+ use_ellipses="true"
+ value="SampleParcel, Name Long (145, 228, 26)"
+ width="310" />
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="Parcel_PG_Dark"
+ layout="topleft"
+ left="10"
+ name="rating_icon"
+ width="18" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="12"
+ name="rating_label"
+ top_delta="3"
+ value="Rating:"
+ width="60" />
+ <text
+ follows="left|right|top"
+ height="16"
+ layout="topleft"
+ left_pad="0"
+ name="rating_value"
+ top_delta="0"
+ value="unknown"
+ width="200" />
+ <expandable_text
+ follows="left|top|right"
+ height="106"
+ layout="topleft"
+ left="6"
+ name="event_desc"
+ width="313" />
+ </layout_panel>
+ <layout_panel
+ follows="left|right"
+ height="24"
+ layout="topleft"
+ mouse_opaque="false"
+ name="button_panel"
+ top="0"
+ left="0"
+ user_resize="false">
+ <button
+ follows="left|top"
+ height="18"
+ image_selected="AddItem_Press"
+ image_unselected="AddItem_Off"
+ image_disabled="AddItem_Disabled"
+ layout="topleft"
+ left="6"
+ name="create_event_btn"
+ picture_style="true"
+ tool_tip="Create Event"
+ width="18" />
+ <button
+ follows="left|top"
+ height="18"
+ image_selected="MinusItem_Press"
+ image_unselected="MinusItem_Off"
+ image_disabled="MinusItem_Disabled"
+ layout="topleft"
+ visible="false"
+ left="6"
+ top_pad="-7"
+ name="god_delete_event_btn"
+ picture_style="true"
+ tool_tip="Delete Event"
+ width="18" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Notify Me"
+ layout="topleft"
+ left_pad="3"
+ top_delta="-12"
+ name="notify_btn"
+ width="100" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Teleport"
+ layout="topleft"
+ left_pad="5"
+ name="teleport_btn"
+ width="100" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Map"
+ layout="topleft"
+ left_pad="5"
+ name="map_btn"
+ width="85" />
+ </layout_panel>
+ </layout_stack>
+ </floater>
+
diff --git a/indra/newview/skins/default/xui/en/floater_help_browser.xml b/indra/newview/skins/default/xui/en/floater_help_browser.xml
index be32e917e5..214fb6ce54 100644
--- a/indra/newview/skins/default/xui/en/floater_help_browser.xml
+++ b/indra/newview/skins/default/xui/en/floater_help_browser.xml
@@ -2,7 +2,7 @@
<floater
legacy_header_height="18"
can_resize="true"
- height="480"
+ height="600"
layout="topleft"
min_height="150"
min_width="500"
@@ -11,7 +11,7 @@
save_rect="true"
single_instance="true"
title="HELP BROWSER"
- width="620">
+ width="650">
<floater.string
name="loading_text">
Loading...
@@ -20,20 +20,20 @@
name="done_text">
</floater.string>
<layout_stack
- bottom="480"
+ bottom="600"
follows="left|right|top|bottom"
layout="topleft"
left="5"
name="stack1"
top="20"
- width="610">
+ width="640">
<layout_panel
layout="topleft"
left_delta="0"
top_delta="0"
name="external_controls"
user_resize="false"
- width="590">
+ width="620">
<web_browser
bottom="-11"
follows="left|right|top|bottom"
@@ -41,8 +41,8 @@
left="0"
name="browser"
top="0"
- height="500"
- width="590" />
+ height="610"
+ width="620" />
<text
follows="bottom|left"
height="16"
diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml
index bd25288a9e..964713adbf 100644
--- a/indra/newview/skins/default/xui/en/floater_im_container.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_container.xml
@@ -19,8 +19,13 @@
left="1"
name="im_box_tab_container"
tab_position="bottom"
- tab_width="80"
+ tab_width="64"
+ tab_max_width = "134"
tab_height="16"
+ use_custom_icon_ctrl="true"
+ tab_icon_ctrl_pad="2"
+ font_halign="left"
+ use_ellipses="true"
top="0"
width="390" />
<icon
diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml
index e187eabd3a..0d381fe5cb 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory.xml
@@ -20,11 +20,11 @@
</floater.string>
<floater.string
name="TitleFetching">
- Inventory (Fetching [ITEM_COUNT] Items...) [FILTER]
+ MY INVENTORY (Fetching [ITEM_COUNT] Items...) [FILTER]
</floater.string>
<floater.string
name="TitleCompleted">
- Inventory ([ITEM_COUNT] Items) [FILTER]
+ MY INVENTORY ([ITEM_COUNT] Items) [FILTER]
</floater.string>
<floater.string
name="Fetched">
diff --git a/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml
index 90fee857fb..388825d31a 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml
@@ -104,6 +104,23 @@
width="16" />
<check_box
height="16"
+ label="Meshes"
+ layout="topleft"
+ left_pad="2"
+ name="check_mesh"
+ top_delta="0"
+ width="126" />
+ <icon
+ height="16"
+ image_name="Inv_Mesh"
+ layout="topleft"
+ left="8"
+ mouse_opaque="true"
+ name="icon_mesh"
+ top="142"
+ width="16" />
+ <check_box
+ height="16"
label="Notecards"
layout="topleft"
left_pad="2"
@@ -117,7 +134,7 @@
left="8"
mouse_opaque="true"
name="icon_object"
- top="142"
+ top="162"
width="16" />
<check_box
height="16"
@@ -134,7 +151,7 @@
left="8"
mouse_opaque="true"
name="icon_script"
- top="162"
+ top="182"
width="16" />
<check_box
height="16"
@@ -151,7 +168,7 @@
left="8"
mouse_opaque="true"
name="icon_sound"
- top="182"
+ top="202"
width="16" />
<check_box
height="16"
@@ -168,7 +185,7 @@
left="8"
mouse_opaque="true"
name="icon_texture"
- top="202"
+ top="222"
width="16" />
<check_box
height="16"
@@ -185,7 +202,7 @@
left="8"
mouse_opaque="true"
name="icon_snapshot"
- top="222"
+ top="242"
width="16" />
<check_box
height="16"
@@ -203,7 +220,7 @@
layout="topleft"
left="8"
name="All"
- top="242"
+ top="262"
width="100" />
<button
follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/floater_map.xml b/indra/newview/skins/default/xui/en/floater_map.xml
index 1903e7c714..5d35275e17 100644
--- a/indra/newview/skins/default/xui/en/floater_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_map.xml
@@ -3,12 +3,10 @@
legacy_header_height="18"
can_minimize="true"
can_resize="true"
- center_horiz="true"
- center_vert="true"
follows="top|right"
height="218"
layout="topleft"
- min_height="60"
+ min_height="174"
min_width="174"
name="Map"
title="Mini Map"
@@ -16,6 +14,8 @@
save_rect="true"
save_visibility="true"
single_instance="true"
+ left="0"
+ top="0"
width="200">
<floater.string
name="mini_map_north">
diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
index eb772cc0bd..2bafd1bdef 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -89,18 +89,29 @@ No Answer. Please try again later.
top="27"
width="315"
word_wrap="true">
- You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnected to Nearby Voice Chat.
+ You have been disconnected from [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY]
</text>
<text
font="SansSerifLarge"
height="40"
layout="topleft"
left="77"
- name="nearby_P2P"
+ name="nearby_P2P_by_other"
top="27"
width="315"
word_wrap="true">
- [VOICE_CHANNEL_NAME] has ended the call. You will now be reconnected to Nearby Voice Chat.
+ [VOICE_CHANNEL_NAME] has ended the call. [RECONNECT_NEARBY]
+ </text>
+ <text
+ font="SansSerifLarge"
+ height="40"
+ layout="topleft"
+ left="77"
+ name="nearby_P2P_by_agent"
+ top="27"
+ width="315"
+ word_wrap="true">
+ You have ended the call. [RECONNECT_NEARBY]
</text>
<text
font="SansSerif"
diff --git a/indra/newview/skins/default/xui/en/floater_postcard.xml b/indra/newview/skins/default/xui/en/floater_postcard.xml
index 3a7b6cc832..6f78363b25 100644
--- a/indra/newview/skins/default/xui/en/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/en/floater_postcard.xml
@@ -128,19 +128,9 @@
width="420">
Type your message here.
</text_editor>
- <text
- type="string"
- length="1"
- bottom_delta="37"
- follows="left|bottom"
- layout="topleft"
- left="12"
- name="fine_print">
- If your recipient joins SL, you&apos;ll get a referral bonus.
- </text>
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Cancel"
layout="topleft"
name="cancel_btn"
@@ -149,7 +139,7 @@
width="100" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Send"
layout="topleft"
left_delta="-106"
diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml
index 775e7d66f7..9ca18d455b 100644
--- a/indra/newview/skins/default/xui/en/floater_search.xml
+++ b/indra/newview/skins/default/xui/en/floater_search.xml
@@ -2,16 +2,16 @@
<floater
legacy_header_height="13"
can_resize="true"
- height="546"
+ height="600"
layout="topleft"
- min_height="546"
- min_width="670"
+ min_height="400"
+ min_width="450"
name="floater_search"
help_topic="floater_search"
save_rect="true"
single_instance="true"
title="FIND"
- width="670">
+ width="650">
<floater.string
name="loading_text">
Loading...
@@ -21,20 +21,20 @@
Done
</floater.string>
<layout_stack
- bottom="541"
+ bottom="595"
follows="left|right|top|bottom"
layout="topleft"
left="10"
name="stack1"
top="20"
- width="650">
+ width="630">
<layout_panel
layout="topleft"
left_delta="0"
top_delta="0"
name="browser_layout"
user_resize="false"
- width="650">
+ width="630">
<web_browser
bottom="-10"
follows="left|right|top|bottom"
@@ -42,8 +42,8 @@
left="0"
name="browser"
top="0"
- height="500"
- width="650" />
+ height="555"
+ width="630" />
<text
follows="bottom|left"
height="16"
diff --git a/indra/newview/skins/default/xui/en/floater_test_inspectors.xml b/indra/newview/skins/default/xui/en/floater_test_inspectors.xml
index 0f5c5f2be0..209285da2e 100644
--- a/indra/newview/skins/default/xui/en/floater_test_inspectors.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_inspectors.xml
@@ -116,10 +116,10 @@
follows="left|top"
font="SansSerif"
height="20"
- left="0"
+ left="10"
max_length="65536"
name="slurl"
- top_pad="4"
+ top_pad="20"
width="150">
secondlife:///app/agent/00000000-0000-0000-0000-000000000000/inspect
</text>
@@ -127,12 +127,11 @@
follows="left|top"
font="SansSerif"
height="20"
- left="0"
+ left="10"
max_length="65536"
name="slurl_group"
- top_pad="4"
+ top_pad="20"
width="150">
secondlife:///app/group/00000000-0000-0000-0000-000000000000/inspect
</text>
-
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_test_text_editor.xml b/indra/newview/skins/default/xui/en/floater_test_text_editor.xml
index dc8f00d5f3..b730f0e511 100644
--- a/indra/newview/skins/default/xui/en/floater_test_text_editor.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_text_editor.xml
@@ -28,4 +28,17 @@
width="200">
This contains long text and should scroll horizontally to the right
</text_editor>
+ <text_editor
+ height="50"
+ follows="top|left|bottom"
+ font="SansSerif"
+ left="10"
+ name="numeric_text_editor"
+ tool_tip="text editor for numeric text entry only"
+ top_pad="10"
+ text_type="int"
+ width="200">
+ This is text that is NOT a number, so shouldn't appear
+ </text_editor>
+
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 5630dfbe8f..ceca9385f3 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -67,80 +67,75 @@
</floater.string>
<button
follows="left|top"
- height="20"
- image_disabled="Tool_Zoom"
- image_disabled_selected="Tool_Zoom"
- image_selected="Tool_Zoom_Selected"
- image_unselected="Tool_Zoom"
+ height="25"
+ image_bottom_pad="1"
+ image_overlay="Tool_Zoom"
+ image_selected="PushButton_Selected_Press"
layout="topleft"
left="10"
name="button focus"
tool_tip="Focus"
- width="20">
+ width="35">
<button.commit_callback
function="BuildTool.setTool"
parameter="Focus" />
</button>
<button
follows="left|top"
- height="20"
- image_disabled="Tool_Grab"
- image_disabled_selected="Tool_Grab"
- image_selected="Tool_Grab_Selected"
- image_unselected="Tool_Grab"
+ height="25"
+ image_bottom_pad="1"
+ image_overlay="Tool_Grab"
+ image_selected="PushButton_Selected_Press"
layout="topleft"
- left_pad="20"
+ left_pad="10"
name="button move"
tool_tip="Move"
- width="20">
+ width="35">
<button.commit_callback
function="BuildTool.setTool"
parameter="Move" />
</button>
<button
follows="left|top"
- height="20"
- image_disabled="Tool_Face"
- image_disabled_selected="Tool_Face"
- image_selected="Tool_Face_Selected"
- image_unselected="Tool_Face"
+ height="25"
+ image_bottom_pad="1"
+ image_overlay="Tool_Face"
+ image_selected="PushButton_Selected_Press"
layout="topleft"
- left_pad="20"
+ left_pad="10"
name="button edit"
tool_tip="Edit"
- width="20">
+ width="35">
<button.commit_callback
function="BuildTool.setTool"
parameter="Edit" />
</button>
<button
follows="left|top"
- height="20"
- image_disabled="Tool_Create"
- image_disabled_selected="Tool_Create"
- image_selected="Tool_Create_Selected"
- image_unselected="Tool_Create"
+ height="25"
+ image_bottom_pad="1"
+ image_overlay="Tool_Create"
+ image_selected="PushButton_Selected_Press"
layout="topleft"
- left_pad="20"
+ left_pad="10"
name="button create"
tool_tip="Create"
- width="20">
+ width="35">
<button.commit_callback
function="BuildTool.setTool"
parameter="Create" />
</button>
<button
follows="left|top"
- height="20"
- image_disabled="Tool_Dozer"
- image_disabled_selected="Tool_Dozer"
- image_selected="Tool_Dozer_Selected"
- image_unselected="Tool_Dozer"
+ height="25"
+ image_bottom_pad="1"
+ image_overlay="Tool_Dozer"
+ image_selected="PushButton_Selected_Press"
layout="topleft"
- left_pad="20"
+ left_pad="10"
name="button land"
tool_tip="Land"
- width="20">
+ width="35">
<button.commit_callback
function="BuildTool.setTool"
parameter="Land" />
@@ -1043,7 +1038,7 @@ even though the user gets a free copy.
<check_box
height="15"
width="110"
- top_pad="3"
+ top_pad="5"
label="Show in search"
layout="topleft"
left="100"
@@ -2001,6 +1996,9 @@ even though the user gets a free copy.
label="Cylinder"
name="Cylinder"
value="Cylinder" />
+ <combo_box.item
+ label="Mesh"
+ value="Mesh" />
</combo_box>
</panel>
diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml
index e1df50bf58..86ac7c8e54 100644
--- a/indra/newview/skins/default/xui/en/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_world_map.xml
@@ -4,7 +4,7 @@
can_resize="true"
center_horiz="true"
center_vert="true"
- height="535"
+ height="600"
layout="topleft"
min_height="520"
min_width="520"
@@ -14,16 +14,16 @@
save_visibility="true"
single_instance="true"
title="WORLD MAP"
- width="800">
+ width="650">
<panel
filename="panel_world_map.xml"
follows="all"
- height="500"
+ height="555"
layout="topleft"
left="10"
name="objects_mapview"
top="25"
- width="542" />
+ width="375" />
<panel
name="layout_panel_1"
height="22"
@@ -279,12 +279,12 @@
<icon
follows="top|right"
height="16"
- image_name="map_event.tga"
+ image_name="Parcel_PG_Dark"
layout="topleft"
mouse_opaque="true"
name="event"
left_pad="0"
- width="16" />
+ width="18" />
<text
type="string"
length="1"
@@ -312,13 +312,13 @@
<icon
follows="top|right"
height="16"
- image_name="map_event_mature.tga"
+ image_name="Parcel_M_Dark"
layout="topleft"
mouse_opaque="true"
name="events_mature_icon"
top_delta="0"
left_pad="0"
- width="16" />
+ width="18" />
<text
type="string"
length="1"
@@ -345,13 +345,13 @@
<icon
follows="top|right"
height="16"
- image_name="map_event_adult.tga"
+ image_name="Parcel_R_Dark"
layout="topleft"
left_pad="0"
mouse_opaque="true"
name="events_adult_icon"
top_delta="0"
- width="16" />
+ width="18" />
<text
type="string"
length="1"
@@ -394,7 +394,7 @@
<panel
follows="right|top|bottom"
- height="270"
+ height="310"
top_pad="0"
width="238">
<icon
@@ -514,7 +514,7 @@
draw_stripes="false"
bg_writeable_color="MouseGray"
follows="all"
- height="115"
+ height="145"
layout="topleft"
left="28"
name="search_results"
diff --git a/indra/newview/skins/default/xui/en/menu_inventory_add.xml b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
index 5ad099e2d9..0d974075f5 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
@@ -42,6 +42,26 @@
<menu_item_call.on_enable
function="File.EnableUpload" />
</menu_item_call>
+ <menu_item_call
+ label="Model (L$[COST])..."
+ layout="topleft"
+ name="Upload Model">
+ <menu_item_call.on_click
+ function="File.UploadModel"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ </menu_item_call>
+ <menu_item_call
+ label="Scene..."
+ layout="topleft"
+ name="Upload Scene">
+ <menu_item_call.on_click
+ function="File.UploadScene"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ </menu_item_call>
<menu_item_call
label="Bulk (L$[COST] per file)..."
layout="topleft"
@@ -226,4 +246,4 @@
parameter="eyes" />
</menu_item_call>
</menu>
-</menu> \ No newline at end of file
+</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml
index 5a9509e284..d66818e91a 100644
--- a/indra/newview/skins/default/xui/en/menu_object.xml
+++ b/indra/newview/skins/default/xui/en/menu_object.xml
@@ -87,16 +87,6 @@
label="Remove â–¶"
name="Remove">
<menu_item_call
- enabled="false"
- label="Take"
- name="Pie Object Take">
- <menu_item_call.on_click
- function="Tools.BuyOrTake" />
- <menu_item_call.on_enable
- function="Tools.EnableBuyOrTake"
- parameter="Buy,Take" />
- </menu_item_call>
- <menu_item_call
enabled="false"
label="Report Abuse"
name="Report Abuse...">
@@ -134,6 +124,16 @@
</menu_item_call>
</context_menu>
<menu_item_separator layout="topleft" />
+ <menu_item_call
+ enabled="false"
+ label="Take"
+ name="Pie Object Take">
+ <menu_item_call.on_click
+ function="Tools.BuyOrTake" />
+ <menu_item_call.on_enable
+ function="Tools.EnableBuyOrTake"
+ parameter="Buy,Take" />
+ </menu_item_call>
<menu_item_call
enabled="false"
label="Take Copy"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 22f4d277a4..07a366da7f 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -55,9 +55,10 @@
</menu_item_call>
<menu_item_check
label="My Inventory"
- layout="topleft"
name="Inventory"
- shortcut="control|shift|I">
+ layout="topleft"
+ shortcut="control|shift|I"
+ visible="false">
<menu_item_check.on_check
function="Floater.Visible"
parameter="inventory" />
@@ -65,24 +66,31 @@
function="Floater.Toggle"
parameter="inventory" />
</menu_item_check>
- <menu_item_call
- label="Show Inventory in Side Tray"
+ <menu_item_check
+ label="My Inventory"
name="ShowSidetrayInventory"
+ layout="topleft"
shortcut="control|I"
- visible="false">
- <menu_item_call.on_click
+ visible="true">
+ <menu_item_check.on_check
+ function="SidetrayPanelVisible"
+ parameter="sidepanel_inventory" />
+ <menu_item_check.on_click
function="ShowSidetrayPanel"
parameter="sidepanel_inventory" />
- </menu_item_call>
- <menu_item_call
+ </menu_item_check>
+ <menu_item_check
label="My Gestures"
layout="topleft"
name="Gestures"
shortcut="control|G">
- <menu_item_call.on_click
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="gestures" />
+ <menu_item_check.on_click
function="Floater.Toggle"
parameter="gestures" />
- </menu_item_call>
+ </menu_item_check>
<menu
label="My Status"
layout="topleft"
@@ -1594,6 +1602,17 @@
name="Shortcuts"
tear_off="true"
visible="false">
+ <menu_item_call
+ label="Image (L$[COST])..."
+ layout="topleft"
+ name="Upload Image"
+ shortcut="control|U">
+ <menu_item_call.on_click
+ function="File.UploadImage"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ </menu_item_call>
<menu_item_check
label="Search"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index cc71f53bd7..56b8440c4f 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -19,7 +19,7 @@
<button
default="true"
index="0"
- name="OK"
+ name="OK_okbutton"
text="$yestext"/>
</form>
</template>
@@ -29,7 +29,7 @@
<button
default="true"
index="0"
- name="OK"
+ name="OK_okignore"
text="$yestext"/>
<ignore text="$ignoretext"/>
</form>
@@ -40,11 +40,11 @@
<button
default="true"
index="0"
- name="OK"
+ name="OK_okcancelbuttons"
text="$yestext"/>
<button
index="1"
- name="Cancel"
+ name="Cancel_okcancelbuttons"
text="$notext"/>
</form>
</template>
@@ -54,11 +54,11 @@
<button
default="true"
index="0"
- name="OK"
+ name="OK_okcancelignore"
text="$yestext"/>
<button
index="1"
- name="Cancel"
+ name="Cancel_okcancelignore"
text="$notext"/>
<ignore text="$ignoretext"/>
</form>
@@ -69,7 +69,7 @@
<button
default="true"
index="0"
- name="OK"
+ name="OK_okhelpbuttons"
text="$yestext"/>
<button
index="1"
@@ -91,7 +91,7 @@
text="$notext"/>
<button
index="2"
- name="Cancel"
+ name="Cancel_yesnocancelbuttons"
text="$canceltext"/>
</form>
</template>
@@ -407,7 +407,7 @@ Do you wish to proceed?
icon="alertmodal.tga"
name="JoinGroupNoCost"
type="alertmodal">
-You are Joining group [NAME].
+You are joining group [NAME].
Do you wish to proceed?
<usetemplate
name="okcancelbuttons"
@@ -1733,21 +1733,6 @@ Try selecting a single parcel.
<notification
icon="alertmodal.tga"
- name="ParcelCanPlayMedia"
- type="alertmodal">
-This location can play streaming media.
-Streaming media requires a fast Internet connection.
-
-Play streaming media when available?
-(You can change this option later under Preferences &gt; Privacy.)
- <usetemplate
- name="okcancelbuttons"
- notext="Disable"
- yestext="Play Media"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
name="CannotDeedLandWaitingForServer"
type="alertmodal">
Unable to deed land:
@@ -3851,7 +3836,7 @@ Are you sure you want to quit?
<notification
icon="alertmodal.tga"
name="HelpReportAbuseEmailLL"
- type="alertmodal">
+ type="alert">
Use this tool to report violations of the [http://secondlife.com/corporate/tos.php Terms of Service] and [http://secondlife.com/corporate/cs.php Community Standards].
All reported abuses are investigated and resolved.
@@ -4322,14 +4307,14 @@ Topic: [SUBJECT], Message: [MESSAGE]
icon="notifytip.tga"
name="FriendOnline"
type="notifytip">
-[FIRST] [LAST] is Online
+[NAME_SLURL] is Online
</notification>
<notification
icon="notifytip.tga"
name="FriendOffline"
type="notifytip">
-[FIRST] [LAST] is Offline
+[NAME_SLURL] is Offline
</notification>
<notification
@@ -4763,7 +4748,7 @@ The objects on the selected parcel that are NOT owned by you have been returned
name="ServerObjectMessage"
type="notify">
Message from [NAME]:
-[MSG]
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
</notification>
<notification
@@ -5863,7 +5848,7 @@ Attachment has been saved.
Unable to find the help topic for this element.
</notification>
- <notification
+ <notification
icon="alertmodal.tga"
name="ObjectMediaFailure"
type="alertmodal">
@@ -5893,6 +5878,17 @@ Your voice has been muted by moderator.
name="okbutton"
yestext="OK"/>
</notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="UploadCostConfirmation"
+ type="alertmodal">
+This upload will cost L$[PRICE], do you wish to continue with the upload?
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Cancel"
+ yestext="Upload"/>
+ </notification>
<notification
icon="alertmodal.tga"
diff --git a/indra/newview/skins/default/xui/en/panel_active_object_row.xml b/indra/newview/skins/default/xui/en/panel_active_object_row.xml
index 7657fb8055..bef5f8dafd 100644
--- a/indra/newview/skins/default/xui/en/panel_active_object_row.xml
+++ b/indra/newview/skins/default/xui/en/panel_active_object_row.xml
@@ -10,10 +10,6 @@
background_opaque="false"
background_visible="true"
bg_alpha_color="0.0 0.0 0.0 0.0" >
- <string
- name="unknown_obj">
- Unknown Object
- </string>
<chiclet_script
name="object_chiclet"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index aad55685d2..0755813389 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -247,7 +247,7 @@
<layout_panel
mouse_opaque="false"
follows="left|right"
- height="29"
+ height="30"
layout="topleft"
top="0"
name="chiclet_list_panel"
@@ -260,12 +260,12 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
<chiclet_panel
mouse_opaque="false"
follows="left|right"
- height="23"
+ height="24"
layout="topleft"
left="1"
min_width="110"
name="chiclet_list"
- top="8"
+ top="7"
chiclet_padding="4"
scrolling_offset="40"
width="189">
diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml
index 89d632c4c6..51e2256a7d 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml
@@ -19,7 +19,7 @@
name="avatar_icon"
top="3"
width="18" />
- <text_editor
+ <text
allow_scroll="false"
v_pad = "7"
read_only = "true"
diff --git a/indra/newview/skins/default/xui/en/panel_classified_info.xml b/indra/newview/skins/default/xui/en/panel_classified_info.xml
index 31719aad20..34c1923582 100644
--- a/indra/newview/skins/default/xui/en/panel_classified_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml
@@ -29,7 +29,7 @@
layout="topleft"
name="back_btn"
picture_style="true"
- left="10"
+ left="11"
tab_stop="false"
top="2"
width="23" />
@@ -40,7 +40,7 @@
layout="topleft"
left_pad="10"
name="title"
- text_color="white"
+ text_color="LtGray"
top="0"
value="Classified Info"
use_ellipses="true"
@@ -49,13 +49,13 @@
color="DkGray2"
opaque="true"
follows="all"
- height="500"
+ height="502"
layout="topleft"
- left="10"
+ left="9"
top_pad="10"
name="profile_scroll"
reserve_scroll_corner="false"
- width="313">
+ width="310">
<panel
name="scroll_content_panel"
follows="left|top"
@@ -65,16 +65,16 @@
background_visible="false"
height="500"
left="0"
- width="295">
+ width="285">
<texture_picker
enabled="false"
- follows="left|top"
+ follows="left|top|right"
height="197"
layout="topleft"
- left="10"
+ left="11"
name="classified_snapshot"
- top="20"
- width="290" />
+ top="10"
+ width="286" />
<text_editor
allow_scroll="false"
bg_visible="false"
@@ -181,37 +181,35 @@
</scroll_container>
<panel
follows="left|right|bottom"
- height="20"
+ height="35"
layout="topleft"
- top_pad="8"
- left="10"
+ top_pad="5"
+ left="9"
name="buttons">
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Teleport"
layout="topleft"
left="0"
name="teleport_btn"
top="0"
- width="90" />
+ width="101" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Map"
layout="topleft"
- left_pad="10"
+ left_pad="3"
name="show_on_map_btn"
- top="0"
- width="90" />
+ width="100" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Edit"
layout="topleft"
- right="-1"
name="edit_btn"
- top="0"
- width="90" />
+ left_pad="3"
+ width="101" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
index 0c1418fc2d..1375eb87d9 100644
--- a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
@@ -64,7 +64,7 @@
layout="topleft"
left="103"
name="description"
- textbox.mouse_opaque="false"
+ textbox.show_context_menu="false"
top_pad="0"
width="178"
word_wrap="true" />
@@ -76,6 +76,6 @@
left_pad="5"
right="-8"
name="info_chevron"
- top_delta="15"
+ top_delta="24"
width="20" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_classified.xml b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
index 188ded3dab..a357ba1d97 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_classified.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
@@ -23,7 +23,7 @@
layout="topleft"
name="back_btn"
picture_style="true"
- left="10"
+ left="11"
tab_stop="false"
top="2"
width="23" />
@@ -31,27 +31,27 @@
type="string"
length="1"
follows="top"
- font="SansSerifHuge"
- height="15"
+ font="SansSerifHugeBold"
+ height="26"
layout="topleft"
left_pad="10"
name="title"
- text_color="white"
- top="5"
+ text_color="LtGray"
+ top="0"
width="250">
Edit Classified
</text>
<scroll_container
color="DkGray2"
follows="all"
- height="510"
+ height="502"
layout="topleft"
- left="10"
+ left="9"
top_pad="10"
name="profile_scroll"
reserve_scroll_corner="false"
opaque="true"
- width="313">
+ width="310">
<panel
name="scroll_content_panel"
follows="left|top"
@@ -65,10 +65,10 @@
<texture_picker
follows="left|top|right"
height="197"
- width="290"
+ width="286"
layout="topleft"
- top="20"
- left="10"
+ top="10"
+ left="11"
name="classified_snapshot" />
<icon
height="18"
@@ -78,7 +78,7 @@
name="edit_icon"
label=""
tool_tip="Click to select an image"
- top="27"
+ top="17"
width="18" />
<text
type="string"
@@ -165,29 +165,29 @@
</text>
<button
follows="left|top"
- height="20"
+ height="23"
label="Set to Current Location"
layout="topleft"
- left="8"
+ left="10"
top_pad="5"
name="set_to_curr_location_btn"
- width="200" />
+ width="156" />
<combo_box
follows="left|top"
- height="18"
+ height="23"
label=""
left="10"
name="category"
top_pad="5"
- width="200" />
+ width="156" />
<combo_box
allow_text_entry="false"
follows="left|top"
- height="18"
+ height="23"
left="10"
name="content_type"
top_pad="5"
- width="200">
+ width="156">
<combo_item
name="mature_ci"
value="Mature">
@@ -203,10 +203,11 @@
decimal_digits="0"
follows="left|top"
halign="left"
- height="16"
+ height="23"
increment="1"
label_width="20"
label="L$"
+ v_pad="10"
layout="topleft"
left="10"
value="50"
@@ -228,30 +229,29 @@
</scroll_container>
<panel
follows="left|right|bottom"
- height="20"
+ height="23"
label="bottom_panel"
layout="topleft"
- left="10"
+ left="9"
name="bottom_panel"
top_pad="5"
width="303">
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Save"
layout="topleft"
name="save_changes_btn"
left="0"
top="0"
- width="130" />
+ width="152" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Cancel"
layout="topleft"
name="cancel_btn"
- left_pad="5"
- right="-1"
- width="130" />
+ left_pad="3"
+ width="152" />
</panel>
</panel>
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 8e39697a16..6ef762dc1d 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
@@ -18,7 +18,7 @@
image_overlay="BackArrow_Off"
layout="topleft"
name="back_btn"
- left="10"
+ left="11"
tab_stop="false"
top="2"
width="23" />
@@ -26,26 +26,26 @@
type="string"
length="1"
follows="top"
- font="SansSerifHuge"
- height="15"
+ font="SansSerifHugeBold"
+ height="26"
layout="topleft"
left_pad="10"
name="title"
- text_color="white"
- top="5"
+ text_color="LtGray"
+ top="0"
width="250">
Edit Pick
</text>
<scroll_container
color="DkGray2"
follows="all"
- height="500"
+ height="502"
layout="topleft"
- left="10"
+ left="9"
top_pad="10"
name="profile_scroll"
opaque="true"
- width="313">
+ width="310">
<panel
name="scroll_content_panel"
follows="left|top|right"
@@ -59,11 +59,11 @@
<texture_picker
follows="left|top|right"
height="197"
- width="280"
+ width="272"
layout="topleft"
no_commit_on_selection="true"
- top="20"
- left="10"
+ top="10"
+ left="11"
name="pick_snapshot" />
<icon
height="18"
@@ -73,7 +73,7 @@
name="edit_icon"
label=""
tool_tip="Click to select an image"
- top="27"
+ top="17"
width="18" />
<text
type="string"
@@ -100,7 +100,7 @@
max_length="63"
name="pick_name"
text_color="black"
- width="280" />
+ width="273" />
<text
type="string"
length="1"
@@ -119,7 +119,7 @@
<text_editor
follows="left|top|right"
height="100"
- width="280"
+ width="273"
hide_scrollbar="false"
layout="topleft"
left="10"
@@ -158,41 +158,40 @@
</text>
<button
follows="left|top"
- height="20"
+ height="23"
label="Set to Current Location"
layout="topleft"
left="8"
top_pad="0"
name="set_to_curr_location_btn"
- width="200" />
+ width="156" />
</panel>
</scroll_container>
<panel
follows="left|right|bottom"
- height="20"
+ height="23"
label="bottom_panel"
layout="topleft"
- left="10"
+ left="9"
name="bottom_panel"
top_pad="5"
width="303">
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Save [WHAT]"
layout="topleft"
name="save_changes_btn"
left="0"
top="0"
- width="130" />
+ width="152" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Cancel"
layout="topleft"
name="cancel_btn"
- left_pad="5"
- right="-1"
- width="130" />
+ left_pad="3"
+ width="152" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml
index 618167181f..662fd1ae73 100644
--- a/indra/newview/skins/default/xui/en/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_general.xml
@@ -20,15 +20,84 @@ Hover your mouse over the options for more help.
name="incomplete_member_data_str">
Retrieving member data
</panel.string>
+ <panel
+ name="group_info_top"
+ follows="top|left"
+ top="0"
+ left="0"
+ height="129"
+ width="313"
+ layout="topleft">
+ <texture_picker
+ follows="left|top"
+ height="110"
+ label=""
+ layout="topleft"
+ left="10"
+ name="insignia"
+ no_commit_on_selection="true"
+ tool_tip="Click to choose a picture"
+ top="5"
+ width="100" />
+ <text
+ font="SansSerifSmall"
+ text_color="White_50"
+ width="190"
+ follows="top|left"
+ layout="topleft"
+ mouse_opaque="false"
+ type="string"
+ height="16"
+ length="1"
+ left_pad="10"
+ name="prepend_founded_by"
+ top_delta="0">
+ Founder:
+ </text>
+ <name_box
+ follows="left|top"
+ height="16"
+ initial_value="(retrieving)"
+ layout="topleft"
+ left_delta="0"
+ link="true"
+ name="founder_name"
+ top_pad="2"
+ use_ellipses="true"
+ width="190" />
+ <text
+ font="SansSerifMedium"
+ text_color="EmphasisColor"
+ type="string"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_delta="0"
+ name="join_cost_text"
+ top_pad="10"
+ visible="true"
+ width="190">
+ Free
+ </text>
+ <button
+ follows="left|top"
+ left_delta="0"
+ top_pad="6"
+ height="23"
+ label="JOIN NOW!"
+ name="btn_join"
+ visible="true"
+ width="120" />
+ </panel>
<text_editor
type="string"
follows="left|top|right"
left="5"
- height="150"
+ height="80"
layout="topleft"
max_length="511"
name="charter"
- top="5"
+ top="105"
right="-1"
bg_readonly_color="DkGray2"
text_readonly_color="White"
@@ -40,7 +109,7 @@ Hover your mouse over the options for more help.
draw_heading="true"
follows="left|top|right"
heading_height="23"
- height="200"
+ height="160"
layout="topleft"
left="0"
name="visible_members"
diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
index 9727c54c6b..375de64923 100644
--- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
@@ -31,7 +31,7 @@ background_visible="true"
follows="top|left"
top="0"
left="0"
- height="129"
+ height="29"
width="313"
layout="topleft">
<button
@@ -70,66 +70,6 @@ background_visible="true"
width="270"
height="20"
visible="false" />
- <texture_picker
- follows="left|top"
- height="113"
- label=""
- layout="topleft"
- left="10"
- name="insignia"
- no_commit_on_selection="true"
- tool_tip="Click to choose a picture"
- top_pad="5"
- width="100" />
- <text
- font="SansSerifSmall"
- text_color="White_50"
- width="190"
- follows="top|left"
- layout="topleft"
- mouse_opaque="false"
- type="string"
- height="16"
- length="1"
- left_pad="10"
- name="prepend_founded_by"
- top_delta="0">
- Founder:
- </text>
- <name_box
- follows="left|top"
- height="16"
- initial_value="(retrieving)"
- layout="topleft"
- left_delta="0"
- link="true"
- name="founder_name"
- top_pad="2"
- use_ellipses="true"
- width="190" />
- <text
- font="SansSerifMedium"
- text_color="EmphasisColor"
- type="string"
- follows="left|top"
- height="16"
- layout="topleft"
- left_delta="0"
- name="join_cost_text"
- top_pad="10"
- visible="true"
- width="190">
- Free
- </text>
- <button
- follows="left|top"
- left_delta="0"
- top_pad="6"
- height="23"
- label="JOIN NOW!"
- name="btn_join"
- visible="true"
- width="120" />
</panel>
<layout_stack
name="layout"
@@ -137,7 +77,7 @@ background_visible="true"
follows="all"
left="0"
top_pad="0"
- height="437"
+ height="537"
width="313"
border_size="0">
<layout_panel
diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
index c7e5b25e06..28c4adf67c 100644
--- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
@@ -11,15 +11,6 @@
name="avatar_icon"
top="-5"
width="105"/>
- <text
- follows="top|left|right"
- font="SansSerifLarge"
- height="19"
- layout="topleft"
- name="avatar_name"
- use_ellipses="true"
- value="Unknown"
- width="110" />
<layout_stack
mouse_opaque="false"
border_size="0"
@@ -30,7 +21,7 @@
left="5"
name="button_stack"
orientation="vertical"
- top_pad="-5"
+ top_pad="5"
width="105">
<layout_panel
mouse_opaque="false"
diff --git a/indra/newview/skins/default/xui/en/panel_instant_message.xml b/indra/newview/skins/default/xui/en/panel_instant_message.xml
index a0ad38cf76..34fd3352a3 100644
--- a/indra/newview/skins/default/xui/en/panel_instant_message.xml
+++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml
@@ -56,16 +56,6 @@
name="adhoc_icon"
top="3"
width="18" />
- <!--<icon
- follows="right"
- height="20"
- image_name=""
- layout="topleft"
- left="3"
- mouse_opaque="true"
- name="sys_msg_icon"
- top="0"
- width="20" />-->
<text
follows="left|right"
font.style="BOLD"
diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
index d1b22a34bb..6927906d3d 100644
--- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
@@ -269,6 +269,7 @@
name="notes_editor"
read_only="true"
text_readonly_color="white"
+ text_type="ascii"
top_pad="5"
width="290"
wrap="true" />
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index 4030c7184a..29c0f1fa4b 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -37,7 +37,7 @@ halign="center"
top_pad="4"
width="305">
<inventory_panel
- border="false"
+ border="false"
follows="all"
height="295"
label="MY INVENTORY"
@@ -48,7 +48,7 @@ halign="center"
top="16"
width="290" />
<inventory_panel
- border="false"
+ border="false"
follows="all"
height="295"
label="RECENT"
@@ -67,7 +67,7 @@ halign="center"
height="30"
layout="bottomleft"
left="0"
- visible="true"
+ visible="true"
name="bottom_panel"
width="330">
<button
@@ -118,7 +118,7 @@ halign="center"
mouse_opaque="false"
name="Inventory Menu"
top="0"
- visible="true"
+ visible="true"
width="290">
<menu
height="101"
@@ -176,6 +176,26 @@ halign="center"
function="File.EnableUpload" />
</menu_item_call>
<menu_item_call
+ label="Model (L$[COST])..."
+ layout="topleft"
+ name="Upload Model">
+ <menu_item_call.on_click
+ function="File.UploadModel"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ </menu_item_call>
+ <menu_item_call
+ label="Scene..."
+ layout="topleft"
+ name="Upload Scene">
+ <menu_item_call.on_click
+ function="File.UploadScene"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ </menu_item_call>
+ <menu_item_call
label="Bulk (L$[COST] per file)..."
layout="topleft"
name="Bulk Upload">
diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
index b2ed51abf3..d484564e0d 100644
--- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
@@ -44,6 +44,7 @@
direction="down"
height="23"
image_overlay="Arrow_Left_Off"
+ image_bottom_pad="1"
layout="topleft"
left="10"
name="back_btn"
@@ -55,6 +56,7 @@
direction="down"
height="23"
image_overlay="Arrow_Right_Off"
+ image_bottom_pad="1"
layout="topleft"
left_pad="0"
name="forward_btn"
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 447ac1b123..446bf0dc6e 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -236,8 +236,8 @@ If you're looking for people to hang out with, [secondlife:///app/worldmap try t
layout="topleft"
left="0"
name="group_list"
- no_filtered_groups_msg="No groups"
- no_groups_msg="[secondlife:///app/search/groups Trying searching for some groups to join.]"
+ no_filtered_groups_msg="[secondlife:///app/search/groups Try fine the group in search?]"
+ no_groups_msg="[secondlife:///app/search/groups Try searching for some groups to join.]"
top="0"
width="313" />
<panel
diff --git a/indra/newview/skins/default/xui/en/panel_pick_info.xml b/indra/newview/skins/default/xui/en/panel_pick_info.xml
index 375f369ba7..097813131f 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml
@@ -16,7 +16,7 @@
image_overlay="BackArrow_Off"
layout="topleft"
name="back_btn"
- left="10"
+ left="11"
tab_stop="false"
top="2"
width="23" />
@@ -27,7 +27,7 @@
layout="topleft"
left_pad="10"
name="title"
- text_color="white"
+ text_color="LtGray"
top="0"
value="Pick Info"
use_ellipses="true"
@@ -36,12 +36,12 @@
color="DkGray2"
opaque="true"
follows="all"
- height="500"
+ height="502"
layout="topleft"
- left="10"
- top_pad="5"
+ left="9"
+ top_pad="10"
name="profile_scroll"
- width="313">
+ width="310">
<panel
name="scroll_content_panel"
follows="left|top|right"
@@ -57,10 +57,10 @@
follows="left|top|right"
height="197"
layout="topleft"
- left="10"
+ left="11"
name="pick_snapshot"
- top="20"
- width="280" />
+ top="10"
+ width="272" />
<text_editor
allow_scroll="false"
bg_visible="false"
@@ -115,8 +115,8 @@
follows="left|right|bottom"
height="35"
layout="topleft"
- top_pad="8"
- left="10"
+ top_pad="5"
+ left="9"
name="buttons">
<button
follows="bottom|left"
@@ -126,24 +126,22 @@
left="0"
name="teleport_btn"
top="0"
- width="90" />
+ width="101" />
<button
follows="bottom|left"
height="23"
label="Map"
layout="topleft"
- left_pad="10"
+ left_pad="3"
name="show_on_map_btn"
- top="0"
- width="90" />
+ width="100" />
<button
follows="bottom|left"
height="23"
label="Edit"
layout="topleft"
- right="-1"
name="edit_btn"
- top="0"
- width="90" />
+ left_pad="3"
+ width="101" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
index e62c1278f9..8b25fb5d2a 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
@@ -64,7 +64,7 @@
layout="topleft"
left="103"
name="picture_descr"
- textbox.mouse_opaque="false"
+ textbox.show_context_menu="false"
top_pad="0"
width="178"
word_wrap="true" />
@@ -76,6 +76,6 @@
left_pad="5"
right="-8"
name="info_chevron"
- top_delta="15"
+ top_delta="24"
width="20" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index d31f4d039f..9ef3649d9c 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
follows="all"
height="540"
label="Picks"
@@ -21,6 +24,7 @@
layout="topleft"
left="6"
name="picks_panel_text"
+ wrap="true"
top="10"
width="313"/>
<accordion
@@ -70,13 +74,15 @@
</accordion_tab>
</accordion>
<panel
- background_visible="true"
+bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
bevel_style="none"
enabled="false"
auto_resize="false"
follows="bottom"
- left="0"
- height="18"
+ left="1"
+ height="27"
label="bottom_panel"
layout="topleft"
name="edit_panel"
@@ -90,9 +96,9 @@
image_unselected="OptionsMenu_Off"
image_disabled="OptionsMenu_Disabled"
layout="topleft"
- left="0"
+ left="10"
name="gear_menu_btn"
- top="5"
+ top="9"
width="18" />
<button
follows="bottom|left"
@@ -104,7 +110,7 @@
left_pad="15"
name="new_btn"
tool_tip="Create a new pick or classified at the current location"
- top="5"
+ top="9"
width="18" />
<button
follows="bottom|right"
@@ -115,14 +121,17 @@
layout="topleft"
name="trash_btn"
right="-10"
- top="5"
+ top="9"
width="18" />
</panel>
<panel
+ bg_opaque_color="DkGray"
+ background_visible="true"
+ background_opaque="true"
layout="topleft"
left="0"
height="30"
- top_pad="10"
+ top_pad="7"
name="buttons_cucks"
width="313">
<button
@@ -131,35 +140,33 @@
height="23"
label="Info"
layout="topleft"
- left="5"
+ left="2"
name="info_btn"
tab_stop="false"
tool_tip="Show pick information"
- top="0"
- width="55" />
+ top="5"
+ width="95" />
<button
enabled="false"
follows="bottom|left"
height="23"
label="Teleport"
layout="topleft"
- left_pad="5"
+ left_pad="3"
name="teleport_btn"
tab_stop="false"
tool_tip="Teleport to the corresponding area"
- top="0"
- width="77" />
+ width="117" />
<button
enabled="false"
follows="bottom|left"
height="23"
label="Map"
layout="topleft"
- left_pad="5"
+ left_pad="3"
name="show_on_map_btn"
tab_stop="false"
tool_tip="Show the corresponding area on the World Map"
- top="0"
- width="50" />
+ width="90" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index 433dfc17fe..2e81139ef2 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -9,13 +9,22 @@
name="chat"
top="1"
width="517">
- <radio_group
+ <text
+ follows="left|top"
+ layout="topleft"
+ left="30"
+ height="12"
+ width="120"
+ top="10">
+ Font size:
+ </text>
+ <radio_group
height="30"
layout="topleft"
- left="30"
- control_name="ChatFontSize"
+ left="40"
+ control_name="ChatFontSize"
name="chat_font_size"
- top="10"
+ top_pad="0"
width="440">
<radio_item
height="16"
@@ -45,12 +54,24 @@
top_delta="0"
width="125" />
</radio_group>
+
+ <text
+ follows="left|top"
+ layout="topleft"
+ left="30"
+ height="12"
+ top_pad="10"
+ width="120"
+ >
+ Font colors:
+ </text>
+
<color_swatch
can_apply_immediately="true"
follows="left|top"
height="47"
layout="topleft"
- left="30"
+ left="40"
name="user"
top_pad="10"
width="44" >
@@ -79,7 +100,7 @@
follows="left|top"
height="47"
layout="topleft"
- left="180"
+ left="190"
name="agent"
top_pad="-17"
width="44" >
@@ -110,7 +131,7 @@
height="47"
label_width="60"
layout="topleft"
- left="350"
+ left="360"
name="im"
top_pad="-17"
width="44">
@@ -141,7 +162,7 @@
height="47"
label_width="44"
layout="topleft"
- left="30"
+ left="40"
name="system"
top_pad="40"
width="44" >
@@ -171,7 +192,7 @@
follows="left|top"
height="47"
layout="topleft"
- left="180"
+ left="190"
name="script_error"
top_pad="-17"
width="44">
@@ -201,7 +222,7 @@
follows="left|top"
height="47"
layout="topleft"
- left="350"
+ left="360"
name="objects"
top_pad="-17"
width="44" >
@@ -231,7 +252,7 @@
follows="left|top"
height="47"
layout="topleft"
- left="30"
+ left="40"
name="owner"
top_pad="40"
width="44" >
@@ -261,7 +282,7 @@
follows="left|top"
height="47"
layout="topleft"
- left="180"
+ left="190"
name="links"
top_pad="-17"
width="44" >
@@ -314,6 +335,8 @@
top_pad="5"
width="400" />
<text
+ follows="left|top"
+ layout="topleft"
left="30"
height="20"
width="120"
@@ -321,17 +344,20 @@
Show IMs in:
</text>
<text
- left_pad="6"
- height="20"
- width="100"
- text_color="White_25"
- >
+ follows="left|top"
+ layout="topleft"
+ top_delta="0"
+ left="120"
+ height="20"
+ width="100"
+ text_color="White_25"
+ >
(requires restart)
</text>
<radio_group
height="30"
layout="topleft"
- left="30"
+ left="40"
control_name="ChatWindow"
name="chat_window"
top_pad="0"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
index f7e3ede93c..f78d90c434 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -17,6 +17,7 @@
follows="left|bottom"
height="23"
label="Clear History"
+ tool_tip="Clear login image, last location, teleport history, web, and texture cache"
layout="topleft"
left="30"
name="clear_cache"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
index 8bff865eb1..ae5e6fbbfa 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -38,7 +38,7 @@
image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
- left_pad="10"
+ left_pad="16"
name="mute_audio"
tab_stop="false"
width="16" />
@@ -82,7 +82,7 @@
image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
- left_pad="10"
+ left_pad="16"
name="mute_audio"
tab_stop="false"
width="16" />
@@ -116,7 +116,7 @@
image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
- left_pad="10"
+ left_pad="16"
name="mute_audio"
tab_stop="false"
width="16" />
@@ -150,7 +150,7 @@
image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
- left_pad="10"
+ left_pad="16"
name="mute_audio"
tab_stop="false"
width="16" />
@@ -184,7 +184,7 @@
image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
- left_pad="10"
+ left_pad="16"
name="mute_audio"
tab_stop="false"
width="16" />
@@ -218,7 +218,7 @@
image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
- left_pad="10"
+ left_pad="16"
name="mute_audio"
tab_stop="false"
width="16" />
@@ -267,7 +267,7 @@
image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
- left_pad="10"
+ left_pad="16"
name="mute_audio"
tab_stop="false"
width="16" />
diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml
index 26568c2a28..c06e67a4bb 100644
--- a/indra/newview/skins/default/xui/en/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_general.xml
@@ -134,6 +134,7 @@
top="200"
width="80" />
<spinner
+ decimal_digits="0"
follows="left|top"
height="20"
increment="1"
diff --git a/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
index 60d4a7e00b..55ab95bfe9 100644
--- a/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
+++ b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
@@ -4,7 +4,7 @@
background_visible="false"
border_visible="false"
border="false"
- chrome="true"
+ chrome="true"
follows="bottom"
height="150"
layout="topleft"
@@ -13,7 +13,7 @@
<!-- floater background image -->
<icon
height="150"
- image_name="Inspector_Background"
+ image_name="Volume_Background"
layout="topleft"
left="0"
name="normal_background"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index d6db451286..b9dd87e878 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -251,6 +251,7 @@
<string name="connected">Connected</string>
<string name="unavailable">Voice not available at your current location</string>
<string name="hang_up">Disconnected from in-world Voice Chat</string>
+ <string name="reconnect_nearby">You will now be reconnected to Nearby Voice Chat</string>
<string name="ScriptQuestionCautionChatGranted">'[OBJECTNAME]', an object owned by '[OWNERNAME]', located in [REGIONNAME] at [REGIONPOS], has been granted permission to: [PERMISSIONS].</string>
<string name="ScriptQuestionCautionChatDenied">'[OBJECTNAME]', an object owned by '[OWNERNAME]', located in [REGIONNAME] at [REGIONPOS], has been denied permission to: [PERMISSIONS].</string>
<string name="ScriptTakeMoney">Take Linden dollars (L$) from you</string>
@@ -1804,7 +1805,7 @@ Clears (deletes) the media and all params from the given face.
<string name="LeaveMouselook">Press ESC to return to World View</string>
<!-- inventory -->
- <string name="InventoryNoMatchingItems">No matching items found in inventory.</string>
+ <string name="InventoryNoMatchingItems">[secondlife:///app/search/groups No matching items found in inventory.Try "Search"?]</string>
<string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string>
<string name="InventoryNoTexture">
You do not have a copy of
@@ -1876,6 +1877,7 @@ this texture in your inventory
<string name="InvFolder favorite">Favorites</string>
<string name="InvFolder Current Outfit">Current Outfit</string>
<string name="InvFolder My Outfits">My Outfits</string>
+ <string name="InvFolder Meshes">Meshes</string>
<!-- are used for Friends and Friends/All folders in Inventory "Calling cards" folder. See EXT-694-->
<string name="InvFolder Friends">Friends</string>
@@ -2128,7 +2130,7 @@ this texture in your inventory
<string name="ClassifiedUpdateAfterPublish">(will update after publish)</string>
<!-- panel picks -->
- <string name="NoPicksClassifiedsText">There are no picks/classifieds here</string>
+ <string name="NoPicksClassifiedsText">You haven't created any Picks or Classifieds. Click the Plus button below to create a Pick or Classified.</string>
<string name="PicksClassifiedsLoadingText">Loading...</string>
<!-- Multi Preview Floater -->
diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml
index 74d8478551..1b34a731a5 100644
--- a/indra/newview/skins/default/xui/en/widgets/button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/button.xml
@@ -7,10 +7,9 @@
image_selected="PushButton_Selected"
image_disabled_selected="PushButton_Selected_Disabled"
image_disabled="PushButton_Disabled"
- image_left_pad="0"
- image_right_pad="0"
image_top_pad="0"
image_bottom_pad="0"
+ imgoverlay_label_space="1"
label_color="ButtonLabelColor"
label_color_selected="ButtonLabelSelectedColor"
label_color_disabled="ButtonLabelDisabledColor"
diff --git a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
index 1228f6be3d..0720621f0b 100644
--- a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
@@ -16,6 +16,6 @@
image_unselected="Search"
image_selected="Search" />
<clear_button label=""
- image_unselected="Icon_Close_Foreground"
- image_selected="Icon_Close_Press" />
+ image_unselected="Icon_Close_Toast"
+ image_selected="Icon_Close_Toast" />
</filter_editor>
diff --git a/indra/newview/skins/default/xui/en/widgets/inspector.xml b/indra/newview/skins/default/xui/en/widgets/inspector.xml
index 8ec206023e..428b2ce03b 100644
--- a/indra/newview/skins/default/xui/en/widgets/inspector.xml
+++ b/indra/newview/skins/default/xui/en/widgets/inspector.xml
@@ -1,10 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<!-- See also settings.xml UIFloater* settings for configuration -->
<inspector name="inspector"
- bg_opaque_color="DkGray_66"
- background_visible="true"
- bg_opaque_image="none"
- background_opaque="true"
- bg_alpha_image="none"
- text_color="InspectorTipTextColor"
- />
+ bg_opaque_color="DkGray_66"
+ background_visible="true"
+ bg_opaque_image="Inspector_Hover"
+ background_opaque="true"
+ bg_alpha_image="none"
+ mouse_opaque="true"
+ text_color="InspectorTipTextColor"/>
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 626135642b..1d61447e31 100644
--- a/indra/newview/skins/default/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml
@@ -4,6 +4,8 @@
Currently that doesn't work because LLUIImage::getWidth/getHeight() return 1 for the images.
-->
<location_input font="SansSerifSmall"
+ icon_maturity_general="Parcel_PG_Light"
+ icon_maturity_adult="Parcel_R_Light"
add_landmark_image_enabled="Favorite_Star_Active"
add_landmark_image_disabled="Favorite_Star_Off"
add_landmark_image_hover="Favorite_Star_Over"
@@ -41,6 +43,13 @@
scale_image="false"
top="19"
left="-3" />
+ <maturity_icon
+ name="maturity_icon"
+ width="18"
+ height="16"
+ top="20"
+ follows="left|top"
+ />
<for_sale_button
name="for_sale_btn"
image_unselected="Parcel_ForSale_Light"
diff --git a/indra/newview/skins/default/xui/en/widgets/search_editor.xml b/indra/newview/skins/default/xui/en/widgets/search_editor.xml
index 1616e4c3f7..a9a760b3a4 100644
--- a/indra/newview/skins/default/xui/en/widgets/search_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/search_editor.xml
@@ -15,7 +15,11 @@
height="13"
image_unselected="Search"
image_selected="Search" />
- <clear_button
+ <clear_button
+ bottom="4"
+ height="16"
image_unselected="Icon_Close_Foreground"
- image_selected="Icon_Close_Press" />
+ image_selected="Icon_Close_Press"
+ pad_right="4"
+ width="16" />
</search_editor>
diff --git a/indra/newview/skins/default/xui/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
index 597c4e83b6..4a163fc1e3 100644
--- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml
+++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
@@ -5,6 +5,7 @@ label_pad_left - padding to the left of tab button labels
-->
<tab_container tab_min_width="60"
tab_max_width="150"
+ use_custom_icon_ctrl="false"
halign="center"
font="SansSerifSmall"
tab_height="21"
diff --git a/indra/newview/skins/default/xui/en/widgets/text_editor.xml b/indra/newview/skins/default/xui/en/widgets/text_editor.xml
index 23ca8ea338..2ced8b1b4b 100644
--- a/indra/newview/skins/default/xui/en/widgets/text_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/text_editor.xml
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!-- Core parameters are in simple_text_editor.xml -->
<text_editor
- allow_html="false"/>
+ allow_html="false"
+ show_context_menu="true"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/tool_tip.xml b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml
index a19201f7c3..9ca15ae50d 100644
--- a/indra/newview/skins/default/xui/en/widgets/tool_tip.xml
+++ b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml
@@ -1,12 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<!-- See also settings.xml UIFloater* settings for configuration -->
<tool_tip name="tooltip"
max_width="200"
padding="4"
wrap="true"
font="SansSerif"
+ mouse_opaque="false"
bg_opaque_image="Tooltip"
background_opaque="true"
background_visible="true"
- text_color="ToolTipTextColor"
- />
+ text_color="ToolTipTextColor"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_about.xml b/indra/newview/skins/default/xui/fr/floater_about.xml
index 7d6d736c5e..440412c0c0 100644
--- a/indra/newview/skins/default/xui/fr/floater_about.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about.xml
@@ -49,19 +49,20 @@ Version Vivox : [VIVOX_VERSION]
- Pour réussir dans les affaires, soyez audacieux, créatif et différent. - Henry Marchant
+Pour réussir dans les affaires, soyez audacieux, créatif et différent. - Henry Marchant
</text_editor>
</panel>
<panel label="Licences" name="licenses_panel">
<text_editor name="credits_editor">
- 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
+ 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
APR Copyright (C) 2000-2004 The Apache Software Foundation
cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
GL Copyright (C) 1999-2004 Brian Paul.
Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
- jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
+ jpeg2000 Copyright (C) 2001, David Taubman, The University of New South
+ Wales (UNSW)
jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
ogg/vorbis Copyright (C) 2001, Xiphophorus
OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
@@ -73,7 +74,8 @@ Version Vivox : [VIVOX_VERSION]
Tous droits réservés. Voir licenses.txt pour plus de détails.
- Codage Audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+ Codage Audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1
+ Annex C)
</text_editor>
</panel>
</tab_container>
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 4c97551e55..8e2b27aca6 100644
--- a/indra/newview/skins/default/xui/fr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml
@@ -12,7 +12,7 @@
<floater.string name="Remaining">
restantes
</floater.string>
- <tab_container name="landtab">
+ <tab_container name="landtab" tab_min_width="60">
<panel label="GÉNÉRAL" name="land_general_panel">
<panel.string name="new users only">
Nouveaux utilisateurs uniquement
@@ -128,10 +128,10 @@
<text name="DwellText">
0
</text>
- <button label="Acheter du terrain" label_selected="Acheter le terrain..." left="130" name="Buy Land..." width="125"/>
- <button label="Infos sur les scripts" name="Scripts..."/>
+ <button label="Acheter du terrain" label_selected="Acheter le terrain..." left_delta="60" name="Buy Land..." width="125"/>
+ <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="130" name="Buy Pass..." tool_tip="Un pass vous donne un accès temporaire à ce terrain." width="125"/>
+ <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."/>
@@ -252,13 +252,13 @@ ou divisé.
</text>
<button label="Afficher" label_selected="Afficher" name="ShowOther" right="-135" width="60"/>
<button label="Retour" label_selected="Renvoyer..." name="ReturnOther..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/>
- <text left="14" name="Selected / sat upon:" width="193">
+ <text left="14" name="Selected / sat upon:" width="220">
Sélectionnées/où quelqu&apos;un est assis :
</text>
- <text left="214" name="selected_objects_text" width="48">
+ <text left_delta="214" name="selected_objects_text" width="48">
[COUNT]
</text>
- <text left="4" name="Autoreturn" width="412">
+ <text left="4" name="Autoreturn" width="440">
Renvoi automatique des objets d&apos;autres résidents (minutes, 0 pour désactiver) :
</text>
<line_editor name="clean other time" right="-6" width="36"/>
@@ -270,9 +270,9 @@ ou divisé.
<name_list label="Plus récents" name="owner list">
<name_list.columns label="Type" name="type"/>
<name_list.columns name="online_status"/>
- <name_list.columns label="Nom" name="name"/>
- <name_list.columns label="Nombre" name="count"/>
- <name_list.columns label="Plus récents" name="mostrecent"/>
+ <name_list.columns label="Nom" name="name" width="100"/>
+ <name_list.columns label="Nombre" name="count" width="100"/>
+ <name_list.columns label="Plus récents" name="mostrecent" width="120"/>
</name_list>
</panel>
<panel label="OPTIONS" name="land_options_panel">
@@ -317,7 +317,7 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
</text>
<check_box label="Tous" left="285" name="edit objects check"/>
<check_box label="Groupe" left="395" name="edit group objects check"/>
- <text left="152" name="allow_label3" width="134">
+ <text left="152" name="allow_label3" width="150">
Laisser entrer des objets :
</text>
<check_box label="Tous" left="285" name="all object entry check"/>
@@ -402,7 +402,8 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
</text>
<line_editor left="97" name="url_description" tool_tip="Texte affiché à côté du bouton Jouer/Charger"/>
<text name="Media texture:">
- Remplacer la texture :
+ Remplacer la
+texture :
</text>
<texture_picker label="" left="97" name="media texture" tool_tip="Cliquez pour sélectionner une image"/>
<text name="replace_texture_help">
@@ -423,8 +424,9 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
<check_box label="En boucle" name="media_loop" tool_tip="Jouer le média en boucle. Lorsque le média aura fini de jouer, il recommencera."/>
</panel>
<panel label="SON" name="land_audio_panel">
- <text name="MusicURL:">
- URL de la musique :
+ <text name="MusicURL:" bottom_delta="-28" >
+ URL de la
+musique :
</text>
<text name="Sound:">
Son :
@@ -455,7 +457,7 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
<check_box label="Vérification de l&apos;âge [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Bannir les résidents qui n&apos;ont pas vérifié leur âge. Consultez la page [SUPPORT_SITE] pour plus d&apos;informations."/>
<check_box label="Autoriser l&apos;accès au groupe : [GROUP]" name="GroupCheck" tool_tip="Définir le groupe à l&apos;onglet Général."/>
<check_box label="Vendre des pass à :" name="PassCheck" tool_tip="Autoriser un accès temporaire à cette parcelle"/>
- <combo_box name="pass_combo">
+ <combo_box name="pass_combo" width="110">
<combo_box.item label="Tout le monde" name="Anyone"/>
<combo_box.item label="Groupe" name="Group"/>
</combo_box>
diff --git a/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml b/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml
index e784bda2e5..65bb683e4c 100644
--- a/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml
@@ -20,7 +20,7 @@
</string>
<tab_container name="ResidentChooserTabs">
<panel label="Rechercher" name="SearchPanel">
- <text name="InstructSearchResidentName">
+ <text name="InstructSearchResidentName" width="240">
Saisissez une partie du nom du résident :
</text>
<button label="OK" label_selected="OK" name="Find"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml b/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml
index 313c9496a2..983efcdc47 100644
--- a/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml
@@ -23,8 +23,8 @@
<texture_picker label="Å’il" name="eyes_iris"/>
<texture_picker label="Alpha yeux" name="eyes_alpha"/>
<texture_picker label="Haut du corps" name="upper-baked"/>
- <texture_picker label="Peinture corporelle haut" name="upper_bodypaint"/>
- <texture_picker label="Sous-vêtements (homme)" name="upper_undershirt"/>
+ <texture_picker label="Peinture corporelle &#10;haut" name="upper_bodypaint"/>
+ <texture_picker label="Sous-vêtements &#10;(homme)" name="upper_undershirt"/>
<texture_picker label="Gants" name="upper_gloves"/>
<texture_picker label="Chemise" name="upper_shirt"/>
<texture_picker label="Veste (haut)" name="upper_jacket"/>
@@ -32,7 +32,7 @@
<texture_picker label="Tatouage haut" name="upper_tattoo"/>
<texture_picker label="Bas du corps" name="lower-baked"/>
<texture_picker label="Peinture corporelle bas" name="lower_bodypaint"/>
- <texture_picker label="Sous-vêtements (femme)" name="lower_underpants"/>
+ <texture_picker label="Sous-vêtements &#10;(femme)" name="lower_underpants"/>
<texture_picker label="Chaussettes" name="lower_socks"/>
<texture_picker label="Chaussures" name="lower_shoes"/>
<texture_picker label="Pantalon" name="lower_pants"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
index 5ea36d8505..c7437c4603 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
@@ -7,7 +7,8 @@
Vous avez besoin de plus de L$
</text>
<text name="contacting">
- En train de contacter le Lindex...
+ En train de contacter
+le Lindex...
</text>
<text left="5" name="info_buying">
Acheter des L$
@@ -59,7 +60,7 @@
</text>
<button label="Acheter" name="buy_btn"/>
<button label="Annuler" name="cancel_btn"/>
- <text left="5" name="info_cannot_buy" right="-5">
+ <text left="5" name="info_cannot_buy" width="200" right="-5">
Achat impossible
</text>
<button label="Accéder au Web" name="error_web"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_land.xml b/indra/newview/skins/default/xui/fr/floater_buy_land.xml
index 1d7eeca3c4..f5cf871844 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_land.xml
@@ -37,10 +37,10 @@
Vous devez accepter le règlement du domaine :
</text>
<text left="470" name="covenant_timestamp_text"/>
- <text_editor name="covenant_editor">
+ <text_editor name="covenant_editor" left="510">
Chargement...
</text_editor>
- <check_box label="J&apos;accepte le règlement ci-dessus." name="agree_covenant"/>
+ <check_box label="J&apos;accepte le règlement ci-dessus." name="agree_covenant" left="510"/>
<text name="info_parcel_label">
Parcelle :
</text>
@@ -79,9 +79,20 @@ vendu avec objets
<combo_box.item label="7,50 US$/mois, facturation trimestrielle" name="US$7.50/month,billedquarterly"/>
<combo_box.item label="6,00 US$/mois, facturation annuelle" name="US$6.00/month,billedannually"/>
</combo_box>
- <text name="land_use_action">
- Augmentez vos frais d&apos;occupation de terrain à 40 US$/mois.
- </text>
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ font="SansSerifBig"
+ height="16"
+ layout="topleft"
+ left="72"
+ name="land_use_action"
+ right="500"
+ top="284"
+ width="400">
+ Augmentez vos frais d&apos;occupation de terrain à 40 US$/mois.
+ </text>
<text name="land_use_reason">
Vous détenez 1 309 m² de terrain.
Cette parcelle fait 512 m².
diff --git a/indra/newview/skins/default/xui/fr/floater_color_picker.xml b/indra/newview/skins/default/xui/fr/floater_color_picker.xml
index c509a4783e..8d7fe76b35 100644
--- a/indra/newview/skins/default/xui/fr/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/fr/floater_color_picker.xml
@@ -25,7 +25,7 @@
<text left="8" name="Current color:">
Couleur actuelle :
</text>
- <text left="8" name="(Drag below to save.)" width="114">
+ <text left="8" name="(Drag below to save.)" width="220">
(Faire glisser dessous pour enregistrer.)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml
index 0b36b7b8ca..15cc6cd1ba 100644
--- a/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml
@@ -59,14 +59,14 @@
</text>
<button label="Ajouter clé" label_selected="Ajouter clé" name="WLAddKey" width="89" bottom="-45" />
<button label="Supprimer clé" label_selected="Supprimer clé" name="WLDeleteKey" width="89" bottom="-70" />
- <text name="WLCurKeyFrameText">
+ <text name="WLCurKeyFrameText" width="170">
Réglages des images-clés :
</text>
- <text name="WLCurKeyTimeText">
+ <text name="WLCurKeyTimeText" width="170">
Heure de la clé :
</text>
- <spinner label="Heure" name="WLCurKeyHour" />
- <spinner label="Min" name="WLCurKeyMin" />
+ <spinner label="Heure" name="WLCurKeyHour" label_width="80" width="74"/>
+ <spinner label="Min" name="WLCurKeyMin" label_width="80"/>
<text name="WLCurKeyTimeText2">
Préréglages clés :
</text>
@@ -78,13 +78,13 @@
<text name="DayCycleText2">
Durée du cycle :
</text>
- <spinner label="Heure" name="WLLengthOfDayHour" />
+ <spinner label="Heure" name="WLLengthOfDayHour" label_width="80" width="74" />
<spinner label="Min" name="WLLengthOfDayMin" />
- <spinner label="S" name="WLLengthOfDaySec" label_width="10" width="50" left_delta="75"/>
- <text name="DayCycleText3">
+ <spinner label="S" name="WLLengthOfDaySec" label_width="10" width="50" left_delta="95"/>
+ <text name="DayCycleText3" left="280" width="200">
Prévisualiser :
</text>
- <button label="Jouer" label_selected="Jouer" name="WLAnimSky" />
+ <button label="Jouer" label_selected="Jouer" name="WLAnimSky" left_delta="90"/>
<button label="Stop !" label_selected="Stop" name="WLStopAnimSky" />
<button label="Utiliser heure domaine" label_selected="Aller heure domaine"
name="WLUseLindenTime" />
diff --git a/indra/newview/skins/default/xui/fr/floater_env_settings.xml b/indra/newview/skins/default/xui/fr/floater_env_settings.xml
index 505c9236c7..dd714e85b6 100644
--- a/indra/newview/skins/default/xui/fr/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/fr/floater_env_settings.xml
@@ -3,7 +3,7 @@
<floater.string name="timeStr">
[hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
</floater.string>
- <text bottom="-45" name="EnvTimeText">
+ <text bottom="-45" name="EnvTimeText" top="29">
Heure de la
journée
</text>
@@ -14,7 +14,7 @@ journée
Couverture
nuageuse
</text>
- <text bottom="-45" name="EnvWaterColorText">
+ <text bottom="-45" name="EnvWaterColorText" top="29">
Couleur de
l&apos;eau
</text>
@@ -23,7 +23,7 @@ l&apos;eau
Brouillard
dans l&apos;eau
</text>
- <button bottom="-144" label="Utiliser heure du domaine" name="EnvUseEstateTimeButton" width="145"/>
+ <button bottom="-144" label="Utiliser heure du domaine" name="EnvUseEstateTimeButton" width="152"/>
<button label="Ciel avancé" left="162" name="EnvAdvancedSkyButton" width="145"/>
<button label="Eau avancée" left="316" name="EnvAdvancedWaterButton" width="145"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_god_tools.xml b/indra/newview/skins/default/xui/fr/floater_god_tools.xml
index 0dedf499bb..187814eba2 100644
--- a/indra/newview/skins/default/xui/fr/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/fr/floater_god_tools.xml
@@ -12,7 +12,7 @@
<line_editor left="85" name="region name" width="198"/>
<check_box label="Initiation" name="check prelude" tool_tip="Définir cette région comme zone d&apos;initiation."/>
<check_box label="Soleil fixe" name="check fixed sun" tool_tip="Définir la position du soleil (comme dans Région et Domaine &gt; Terrain.)"/>
- <check_box height="32" label="Réinitialiser le domicile à la téléportation" name="check reset home" tool_tip="Quand les résidents s&apos;en vont par téléportation, réinitialisez leur domicile sur l&apos;emplacement de destination."/>
+ <check_box height="32" label="Réinitialiser le domicile à la téléportation" name="check reset home" tool_tip="Quand les résidents s&apos;en vont par téléportation, réinitialisez leur domicile sur l&apos;emplacement de destination."/>
<check_box bottom_delta="-32" label="Visible" name="check visible" tool_tip="Cochez pour rendre la région visible aux non-admins."/>
<check_box label="Dégâts" name="check damage" tool_tip="Cochez pour activer les dégâts dans cette région."/>
<check_box label="Bloquer le suivi de trafic" name="block dwell" tool_tip="Cochez pour que la région ne comptabilise pas le trafic."/>
@@ -48,8 +48,8 @@
<spinner left="320" name="land cost" width="70"/>
<button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh" tool_tip="Cliquez ici pour rafraîchir les informations ci-dessus."/>
<button label="Appliquer" label_selected="Appliquer" name="Apply" tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus."/>
- <button label="Sélectionner une région" label_selected="Sélectionner une région" left="136" name="Select Region" tool_tip="Sélectionnez une région entière à l&apos;aide de l&apos;outil Terrain." width="140"/>
- <button label="Sauvegarde automatique" label_selected="Sauvegarde automatique" left="136" name="Autosave now" tool_tip="Sauvegarde automatique au format gzip." width="140"/>
+ <button label="Sélectionner une région" label_selected="Sélectionner une région" left="136" name="Select Region" tool_tip="Sélectionnez une région entière à l&apos;aide de l&apos;outil Terrain." width="160"/>
+ <button label="Sauvegarde automatique" label_selected="Sauvegarde automatique" left="136" name="Autosave now" tool_tip="Sauvegarde automatique au format gzip." width="160"/>
</panel>
<panel label="Objets" name="objects">
<panel.string name="no_target">
diff --git a/indra/newview/skins/default/xui/fr/floater_inspect.xml b/indra/newview/skins/default/xui/fr/floater_inspect.xml
index de74f47bcf..9b1bdf106d 100644
--- a/indra/newview/skins/default/xui/fr/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/fr/floater_inspect.xml
@@ -7,7 +7,7 @@
<scroll_list.columns label="Nom" name="object_name"/>
<scroll_list.columns label="Propriétaire" name="owner_name"/>
<scroll_list.columns label="Créateur" name="creator_name"/>
- <scroll_list.columns label="Date de création" name="creation_date"/>
+ <scroll_list.columns label="Date de création" name="creation_date" width="114"/>
</scroll_list>
<button label="Voir le profil du propriétaire..." name="button owner" tool_tip="Voir le profil du propriétaire de l&apos;objet en surbrillance" width="172"/>
<button label="Voir le profil du créateur..." left="192" name="button creator" tool_tip="Voir le profil du créateur de l&apos;objet en surbrillance" width="172"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
index b0d5df161c..fca1a329a2 100644
--- a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
@@ -47,11 +47,11 @@
<check_box label="Éditer" name="CheckOwnerModify"/>
<check_box label="Copier" name="CheckOwnerCopy"/>
<check_box label="Revendre" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel">
+ <text name="AnyoneLabel" width="80">
N&apos;importe qui :
</text>
<check_box label="Copier" name="CheckEveryoneCopy"/>
- <text name="GroupLabel">
+ <text name="GroupLabel" width="80">
Groupe :
</text>
<check_box label="Partager" name="CheckShareWithGroup"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
index 52f8597dc2..6cd886d4b9 100644
--- a/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
@@ -13,7 +13,7 @@
<check_box label="Photos" name="check_snapshot"/>
<button label="Tout" label_selected="Tout" name="All" width="70"/>
<button bottom_delta="0" label="Aucun" label_selected="Aucun" left="83" name="None" width="70"/>
- <check_box bottom_delta="-20" label="Toujours montrer les dossiers" name="check_show_empty"/>
+ <check_box bottom_delta="-20" label="Toujours montrer les dossiers" name="check_show_empty"/>
<check_box bottom_delta="-36" label="Depuis la déconnexion" name="check_since_logoff"/>
<text name="- OR -">
Ou il y a...
diff --git a/indra/newview/skins/default/xui/fr/floater_joystick.xml b/indra/newview/skins/default/xui/fr/floater_joystick.xml
index d3a1b6c61b..e00f9564e8 100644
--- a/indra/newview/skins/default/xui/fr/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/fr/floater_joystick.xml
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Joystick" title="CONFIGURATION DU JOYSTICK">
<check_box label="Activer :" name="enable_joystick"/>
- <spinner label="Mapping axe des X " name="JoystickAxis1"/>
- <spinner label="Mapping axe des Y" name="JoystickAxis2"/>
- <spinner label="Mapping axe des Z" name="JoystickAxis0"/>
- <spinner label="Mapping du tangage" label_width="111" left="8" name="JoystickAxis4" width="152"/>
- <spinner label="Mapping du lacet" name="JoystickAxis5"/>
- <spinner label="Mapping du roulis" name="JoystickAxis3"/>
- <spinner label="Mapping du zoom" name="JoystickAxis6"/>
+ <spinner label="Mapping axe des X " name="JoystickAxis1" left="20" width="154" label_width="130"/>
+ <spinner label="Mapping axe des Y" name="JoystickAxis2" width="154" label_width="130"/>
+ <spinner label="Mapping axe des Z" name="JoystickAxis0" width="154" label_width="130"/>
+ <spinner label="Mapping du tangage" label_width="136" left="20" name="JoystickAxis4" width="154"/>
+ <spinner label="Mapping du lacet" name="JoystickAxis5" width="154" label_width="130"/>
+ <spinner label="Mapping du roulis" name="JoystickAxis3" width="154" label_width="130"/>
+ <spinner label="Mapping du zoom" name="JoystickAxis6" left="20" width="154" label_width="130"/>
<check_box label="Zoom direct" name="ZoomDirect"/>
- <check_box label="Curseur 3D" name="Cursor3D"/>
- <check_box label="Niveau automatique" name="AutoLeveling"/>
+ <check_box label="Curseur 3D" name="Cursor3D" left="300"/>
+ <check_box label="Niveau automatique" name="AutoLeveling" left="400"/>
<text name="Control Modes:">
Modes de contrôle :
</text>
@@ -44,13 +44,13 @@
<text name="ZDeadZone">
Zone neutre Z
</text>
- <text left="4" name="PitchDeadZone" width="110">
- Zone neutre Tangage
+ <text left="4" name="PitchDeadZone" width="116">
+ Zone neutre tangage
</text>
- <text name="YawDeadZone">
+ <text name="YawDeadZone" left="10" width="104">
Zone neutre lacet
</text>
- <text name="RollDeadZone">
+ <text name="RollDeadZone" left="10" width="104">
Zone neutre roulis
</text>
<text name="Feathering">
@@ -59,7 +59,7 @@
<text name="ZoomScale2">
Échelle du zoom
</text>
- <text left="6" name="ZoomDeadZone" width="110">
+ <text left="6" name="ZoomDeadZone" width="120">
Zone neutre du zoom
</text>
<button label="Options par défaut du joystick" name="SpaceNavigatorDefaults"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml
index b0a2f92f7c..7e7180166d 100644
--- a/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml
@@ -11,5 +11,5 @@
</floater.string>
<button label="Réinitialiser" label_selected="Réinitialiser" left="390" name="Reset" width="100"/>
<check_box initial_value="true" label="Exécution en cours" left="4" name="running"/>
- <check_box initial_value="true" label="Mono" left="130" name="mono"/>
+ <check_box initial_value="true" label="Mono" left_delta="160" name="mono"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml b/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml
index b92c0944de..71d2c42578 100644
--- a/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="script ed float" title="RÉFÉRENCE LSL">
- <check_box label="Suivre le curseur" name="lock_check"/>
- <combo_box label="Verrouiller" left_delta="120" name="history_combo" width="70"/>
- <button label="Précédente" left_delta="75" name="back_btn"/>
- <button label="Suivante" name="fwd_btn"/>
+
+ <check_box label="Suivre le curseur" name="lock_check" width="90" />
+ <combo_box label="Verrouiller" left_delta="120" name="history_combo" width="82"/>
+ <button label="Précédente" name="back_btn" left_delta="75"/>
+ <button label="Suivante" name="fwd_btn" width="60"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_media_browser.xml b/indra/newview/skins/default/xui/fr/floater_media_browser.xml
index 0677c5d41f..58535eddf5 100644
--- a/indra/newview/skins/default/xui/fr/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/fr/floater_media_browser.xml
@@ -15,12 +15,12 @@
<button label="OK" left_delta="515" name="go"/>
</layout_panel>
<layout_panel name="time_controls">
- <button label="en arrière" name="rewind"/>
+ <button label="en arrière" name="rewind" width="60"/>
<button label="stop" name="stop"/>
- <button label="en avant" name="seek"/>
+ <button label="en avant" name="seek" width="60"/>
</layout_panel>
<layout_panel name="parcel_owner_controls">
- <button label="Envoyer la page actuelle à la parcelle" name="assign"/>
+ <button label="Envoyer la page actuelle à la parcelle" name="assign" width="220"/>
</layout_panel>
<layout_panel name="external_controls">
<button label="Ouvrir dans mon navigateur web" name="open_browser" width="196"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml b/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml
index 5993f90cef..d03c4d7544 100644
--- a/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml
@@ -12,7 +12,7 @@
[NOTE2]
</text>
<button label="Commencer" name="start_btn" width="85"/>
- <button label="Stop" left="100" name="stop_btn"/>
- <button label="Libérer" left="177" name="release_btn"/>
- <button label="Fermer" name="close_btn"/>
+ <button label="Stop" name="stop_btn"/>
+ <button label="Libérer" name="release_btn"/>
+ <button label="Fermer" name="close_btn" left_pad="20"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_notification.xml b/indra/newview/skins/default/xui/fr/floater_notification.xml
index 62727da007..fe4b5f9bd6 100644
--- a/indra/newview/skins/default/xui/fr/floater_notification.xml
+++ b/indra/newview/skins/default/xui/fr/floater_notification.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="notification" title="CONSOLE DE NOTIFICATIONS">
<text_editor name="payload">
- Chargement..
+ Chargement...
</text_editor>
<combo_box label="Réponse" name="response"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_pay_object.xml b/indra/newview/skins/default/xui/fr/floater_pay_object.xml
index c96db77721..9cac739ab0 100644
--- a/indra/newview/skins/default/xui/fr/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/fr/floater_pay_object.xml
@@ -17,10 +17,10 @@
<text left="105" name="object_name_text">
...
</text>
- <button label="1 L$" label_selected="1 L$" left="105" name="fastpay 1"/>
- <button label="5 L$" label_selected="5 L$" left="190" name="fastpay 5"/>
- <button label="10 L$" label_selected="10 L$" left="105" name="fastpay 10"/>
- <button label="20 L$" label_selected="20 L$" left="190" name="fastpay 20"/>
+ <button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
+ <button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
+ <button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
+ <button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
<text halign="left" left="5" name="amount text">
Ou choisissez un montant :
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml b/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml
index 2be2ae7c88..f83000cf87 100644
--- a/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml
@@ -4,7 +4,7 @@
<button label="?" label_selected="?" name="help"/>
<check_box label="Partager avec le groupe" name="share_with_group"/>
<check_box label="Autoriser tout le monde à copier" name="everyone_copy"/>
- <text name="NextOwnerLabel">
+ <text name="NextOwnerLabel" width="260">
Le prochain propriétaire pourra :
</text>
<check_box label="Modifier" name="next_owner_modify"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_postcard.xml b/indra/newview/skins/default/xui/fr/floater_postcard.xml
index 6a9a674fac..489b90eeba 100644
--- a/indra/newview/skins/default/xui/fr/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/fr/floater_postcard.xml
@@ -3,19 +3,19 @@
<text name="to_label" width="135">
E-mail du destinataire :
</text>
- <line_editor left="143" name="to_form" width="127"/>
+ <line_editor left="143" name="to_form" width="130" left_delta="146"/>
<text name="from_label">
Votre e-mail :
</text>
- <line_editor left="143" name="from_form" width="127"/>
+ <line_editor left="143" name="from_form" width="130" left_delta="146"/>
<text name="name_label">
Votre nom :
</text>
- <line_editor left="143" name="name_form" width="127"/>
+ <line_editor left="143" name="name_form" width="130" left_delta="146"/>
<text name="subject_label">
Sujet :
</text>
- <line_editor left="143" name="subject_form" width="127"/>
+ <line_editor left="143" name="subject_form" width="130" left_delta="146"/>
<line_editor label="Saisissez votre sujet ici." name="subject_form"/>
<text name="msg_label">
Message :
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml
index 06caf0635d..d866c32882 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml
@@ -6,8 +6,8 @@
<text name="key_label">
Clavier :
</text>
- <combo_box label="Aucun" name="modifier_combo"/>
- <combo_box label="Aucun" name="key_combo"/>
+ <combo_box label="Aucun" name="modifier_combo" width="62"/>
+ <combo_box label="Aucun" name="key_combo" width="62"/>
<text name="replace_text" tool_tip="Remplacez le ou les mots-clés par ces mots. Par exemple, si vous remplacez le mot-clé &quot; bonjour &quot; par &quot; salut &quot;, le chat &quot; Je voulais te dire bonjour &quot; devient &quot; Je voulais te dire salut &quot; et le geste correspondant s&apos;affiche.">
Remplacer :
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_report_abuse.xml b/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
index b96e15e4bb..215df18bd6 100644
--- a/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
@@ -29,13 +29,13 @@
<text name="object_name_label">
Objet :
</text>
- <text left_delta="70" name="object_name" width="105">
+ <text left_pad="26" name="object_name" width="105">
Consetetur Sadipscing
</text>
- <text name="owner_name_label" width="66">
+ <text name="owner_name_label" width="100">
Propriétaire :
</text>
- <text left_delta="70" name="owner_name" width="105">
+ <text left_delta="120" name="owner_name" width="105">
Hendrerit Vulputate Kamawashi Longname
</text>
<combo_box name="category_combo" tool_tip="Choisissez la catégorie qui décrit le mieux ce rapport">
diff --git a/indra/newview/skins/default/xui/fr/floater_sell_land.xml b/indra/newview/skins/default/xui/fr/floater_sell_land.xml
index e950a64c4c..d79726e8e2 100644
--- a/indra/newview/skins/default/xui/fr/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_sell_land.xml
@@ -5,13 +5,13 @@
<text name="info_parcel_label">
Parcelle :
</text>
- <text name="info_parcel">
+ <text name="info_parcel" left="70">
NOM DE LA PARCELLE
</text>
<text name="info_size_label">
Taille :
</text>
- <text name="info_size">
+ <text name="info_size" left="70">
[AREA] m²
</text>
<text bottom_delta="-60" name="info_action">
diff --git a/indra/newview/skins/default/xui/fr/floater_settings_debug.xml b/indra/newview/skins/default/xui/fr/floater_settings_debug.xml
index aae4729347..995837e9ee 100644
--- a/indra/newview/skins/default/xui/fr/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/fr/floater_settings_debug.xml
@@ -4,7 +4,7 @@
<combo_box.item label="VRAI" name="TRUE"/>
<combo_box.item label="FAUX" name="FALSE"/>
</combo_box>
- <color_swatch label="Couleur" name="val_color_swatch"/>
+ <color_swatch label="Couleur" name="val_color_swatch" width="50"/>
<spinner label="x" name="val_spinner_1"/>
<spinner label="x" name="val_spinner_2"/>
<spinner label="x" name="val_spinner_3"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_snapshot.xml b/indra/newview/skins/default/xui/fr/floater_snapshot.xml
index 486eafef01..74738b7e31 100644
--- a/indra/newview/skins/default/xui/fr/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/fr/floater_snapshot.xml
@@ -45,8 +45,8 @@
<combo_box.item label="JPEG" name="JPEG"/>
<combo_box.item label="BMP" name="BMP"/>
</combo_box>
- <spinner label="Largeur" label_width="41" name="snapshot_width" width="101"/>
- <spinner label="Hauteur" label_width="41" left="121" name="snapshot_height" width="101"/>
+ <spinner label="Largeur" label_width="44" name="snapshot_width" width="101"/>
+ <spinner label="Hauteur" label_width="46" left="121" name="snapshot_height" width="101"/>
<slider label="Qualité de l&apos;image" name="image_quality_slider"/>
<text name="layer_type_label">
Capturer :
diff --git a/indra/newview/skins/default/xui/fr/floater_telehub.xml b/indra/newview/skins/default/xui/fr/floater_telehub.xml
index a50cfc25c1..c529ca2736 100644
--- a/indra/newview/skins/default/xui/fr/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/fr/floater_telehub.xml
@@ -10,8 +10,7 @@
Pour supprimer, cliquez sur Déconnecter.
</text>
<text bottom_delta="-18" height="38" name="help_text_not_connected">
- Sélectionner l&apos;objet et cliquez sur Connecter
-le téléhub.
+ Sélectionner l&apos;objet et cliquez sur Connecter le téléhub.
</text>
<button label="Connecter le téléhub" name="connect_btn" width="122"/>
<button label="Déconnecter" left="142" name="disconnect_btn" width="98"/>
@@ -20,7 +19,7 @@ le téléhub.
</text>
<button label="Ajouter point" name="add_spawn_point_btn"/>
<button label="Supprimer point" name="remove_spawn_point_btn"/>
- <text name="spawn_point_help">
+ <text name="spawn_point_help" height="100">
Sélectionnez l&apos;objet et cliquez sur Ajouter pour indiquer la position.
Vous pourrez ensuite déplacer ou supprimer l&apos;objet.
Les positions sont relatives au centre du téléhub.
diff --git a/indra/newview/skins/default/xui/fr/floater_url_entry.xml b/indra/newview/skins/default/xui/fr/floater_url_entry.xml
index 6a90731691..4b2be14569 100644
--- a/indra/newview/skins/default/xui/fr/floater_url_entry.xml
+++ b/indra/newview/skins/default/xui/fr/floater_url_entry.xml
@@ -3,11 +3,11 @@
<text name="media_label">
URL du média :
</text>
- <combo_box left="100" name="media_entry" width="360" />
- <button label="OK" name="ok_btn" />
+ <combo_box name="media_entry"/>
+ <button label="OK" name="ok_btn" width="30" />
<button label="Annuler" name="cancel_btn" />
- <button label="Effacer" name="clear_btn" />
- <text name="loading_label">
+ <button label="Effacer" name="clear_btn" left_pad="94"/>
+ <text name="loading_label" left="120">
Chargement...
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_water.xml b/indra/newview/skins/default/xui/fr/floater_water.xml
index 287f51d9f7..1a74017330 100644
--- a/indra/newview/skins/default/xui/fr/floater_water.xml
+++ b/indra/newview/skins/default/xui/fr/floater_water.xml
@@ -3,7 +3,7 @@
<floater.string name="WLDefaultWaterNames">
Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
</floater.string>
- <text name="KeyFramePresetsText">
+ <text name="KeyFramePresetsText" width="120">
Préréglages eau :
</text>
<button label="Nouveau" label_selected="Nouveau" name="WaterNewPreset"/>
@@ -12,8 +12,7 @@
<tab_container name="Water Tabs">
<panel label="Paramètres" name="Settings">
<text name="BHText">
- Couleur du brouillard
-dans l&apos;eau
+ Couleur du brouillard dans l&apos;eau
</text>
<color_swatch left="75" name="WaterFogColor" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
<text name="WaterFogDensText">
diff --git a/indra/newview/skins/default/xui/fr/floater_windlight_options.xml b/indra/newview/skins/default/xui/fr/floater_windlight_options.xml
index e28de71625..d92fadd048 100644
--- a/indra/newview/skins/default/xui/fr/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/fr/floater_windlight_options.xml
@@ -6,7 +6,7 @@
<button label="Nouveau" label_selected="Nouveau" name="WLNewPreset"/>
<button label="Enregistrer" label_selected="Enregistrer" left_delta="75" name="WLSavePreset" width="75"/>
<button label="Supprimer" label_selected="Supprimer" left_delta="80" name="WLDeletePreset"/>
- <button label="Éditeur du cycle du jour" label_selected="Éditeur du cycle du jour" left_delta="95" name="WLDayCycleMenuButton" width="150"/>
+ <button label="Éditeur du cycle du jour" label_selected="Éditeur du cycle du jour" left_pad="20" left_delta="95" name="WLDayCycleMenuButton" width="150"/>
<tab_container name="WindLight Tabs" width="706">
<panel label="Atmosphère" name="Atmosphere">
<text name="BHText">
diff --git a/indra/newview/skins/default/xui/fr/inspect_remote_object.xml b/indra/newview/skins/default/xui/fr/inspect_remote_object.xml
index 6d8c44578a..6d7cfadc04 100644
--- a/indra/newview/skins/default/xui/fr/inspect_remote_object.xml
+++ b/indra/newview/skins/default/xui/fr/inspect_remote_object.xml
@@ -7,7 +7,7 @@
<text name="object_name">
Nom d&apos;objet de test vraiment très long
</text>
- <text name="object_owner_label">
+ <text name="object_owner_label" width="70">
Propriétaire :
</text>
<text name="object_owner">
diff --git a/indra/newview/skins/default/xui/fr/panel_audio_device.xml b/indra/newview/skins/default/xui/fr/panel_audio_device.xml
index a9540d8346..2caa013f54 100644
--- a/indra/newview/skins/default/xui/fr/panel_audio_device.xml
+++ b/indra/newview/skins/default/xui/fr/panel_audio_device.xml
@@ -6,7 +6,7 @@
<text name="Input device (microphone):">
Périphérique d&apos;entrée (micro) :
</text>
- <text name="Output device (speakers):">
+ <text name="Output device (speakers):" width="300">
Périphérique de sortie (haut-parleurs) :
</text>
<text name="Input level:">
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_alpha.xml b/indra/newview/skins/default/xui/fr/panel_edit_alpha.xml
index 836dd99097..3b81ef2a5f 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_alpha.xml
@@ -5,6 +5,6 @@
<texture_picker label="Alpha haut" name="Upper Alpha" tool_tip="Cliquez pour sélectionner une image"/>
<texture_picker label="Alpha tête" name="Head Alpha" tool_tip="Cliquez pour sélectionner une image"/>
<texture_picker label="Alpha yeux" name="Eye Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Alpha cheveux" name="Hair Alpha" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Alpha cheveux" width="80" name="Hair Alpha" tool_tip="Cliquez pour sélectionner une image"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml b/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml
index e37e0b2481..73e136ade6 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml
@@ -2,7 +2,7 @@
<panel name="edit_gloves_panel">
<panel name="avatar_gloves_color_panel">
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" width="80" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
</panel>
<accordion name="wearable_accordion">
<accordion_tab name="gloves_main_tab" title="Gants"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml b/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml
index 759db657a6..cee44eb795 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml
@@ -3,7 +3,7 @@
<panel name="avatar_jacket_color_panel">
<texture_picker label="Tissu (haut)" name="Upper Fabric" tool_tip="Cliquez pour sélectionner une image"/>
<texture_picker label="Tissu (bas)" name="Lower Fabric" tool_tip="Cliquez pour sélectionner une image"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" width="80" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
</panel>
<accordion name="wearable_accordion">
<accordion_tab name="jacket_main_tab" title="Veste"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_pants.xml b/indra/newview/skins/default/xui/fr/panel_edit_pants.xml
index 5328e885d3..71d82c817f 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_pants.xml
@@ -2,7 +2,7 @@
<panel name="edit_pants_panel">
<panel name="avatar_pants_color_panel">
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" width="80" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
</panel>
<accordion name="wearable_accordion">
<accordion_tab name="pants_main_tab" title="Pantalon"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
index 4a42858861..24cf7844b5 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
@@ -53,7 +53,7 @@
</panel>
</scroll_container>
<panel name="profile_me_buttons_panel">
- <button label="Enregistrer les changements" name="save_btn"/>
+ <button label="Enregistrer les changements" width="166" name="save_btn"/>
<button label="Annuler" name="cancel_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml b/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml
index 0fe7d5bbb0..cf28cd8c1e 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml
@@ -2,7 +2,7 @@
<panel name="edit_shirt_panel">
<panel name="avatar_shirt_color_panel">
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" width="80" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
</panel>
<accordion name="wearable_accordion">
<accordion_tab name="shirt_main_tab" title="Chemise"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml b/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml
index 588a2ca7b2..a8e0910a15 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml
@@ -2,7 +2,7 @@
<panel name="edit_shoes_panel">
<panel name="avatar_shoes_color_panel">
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" width="80" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
</panel>
<accordion name="wearable_accordion">
<accordion_tab name="shoes_main_tab" title="Chaussures"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_skin.xml b/indra/newview/skins/default/xui/fr/panel_edit_skin.xml
index 649b91d66d..dac005f6b6 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_skin.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skin_panel">
<panel name="avatar_skin_color_panel">
- <texture_picker label="Tatouage tête" name="Head Tattoos" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Tatouage haut" name="Upper Tattoos" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Tatouage tête" name="Head Tattoos" width="76" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Tatouage haut" name="Upper Tattoos" width="80" tool_tip="Cliquez pour sélectionner une image"/>
<texture_picker label="Tatouage bas" name="Lower Tattoos" tool_tip="Cliquez pour sélectionner une image"/>
</panel>
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml b/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml
index 9d0f13c4e8..e9784b9510 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml
@@ -2,7 +2,7 @@
<panel name="edit_skirt_panel">
<panel name="avatar_skirt_color_panel">
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" width="80" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
</panel>
<accordion name="wearable_accordion">
<accordion_tab name="skirt_main_tab" title="Jupe"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_socks.xml b/indra/newview/skins/default/xui/fr/panel_edit_socks.xml
index 8b062e0145..6fc6a3dc77 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_socks.xml
@@ -2,7 +2,7 @@
<panel name="edit_socks_panel">
<panel name="avatar_socks_color_panel">
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" width="80" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
</panel>
<accordion name="wearable_accordion">
<accordion_tab name="socks_main_tab" title="Chaussettes"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/fr/panel_edit_tattoo.xml
index 1faee191e0..7ab2aa6bc9 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_tattoo.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_tattoo.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_tattoo_panel">
<panel name="avatar_tattoo_color_panel">
- <texture_picker label="Tatouage tête" name="Head Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Tatouage haut" name="Upper Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Tatouage bas" name="Lower Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Tatouage tête" name="Head Tattoo" width="76" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Tatouage haut" name="Upper Tattoo" width="80" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Tatouage bas" name="Lower Tattoo" width="76" tool_tip="Cliquez pour sélectionner une image"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml b/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml
index b9164ad862..6323462877 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml
@@ -2,7 +2,7 @@
<panel name="edit_underpants_panel">
<panel name="avatar_underpants_color_panel">
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" width="80" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
</panel>
<accordion name="wearable_accordion">
<accordion_tab name="underpants_main_tab" title="Sous-vêtements (femme)"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml
index 462eff9451..5af733d8a2 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml
@@ -2,7 +2,7 @@
<panel name="edit_undershirt_panel">
<panel name="avatar_undershirt_color_panel">
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ <color_swatch label="Couleur/Teinte" name="Color/Tint" width="80" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
</panel>
<accordion name="wearable_accordion">
<accordion_tab name="undershirt_main_tab" title="Sous-vêtements (homme)"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml b/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml
index 24ea030b33..c6ab686b0e 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml
@@ -96,6 +96,6 @@
</panel>
<panel name="button_panel">
<button label="Enregistrer sous" name="save_as_button"/>
- <button label="Annuler modification" name="revert_button"/>
+ <button label="Annuler modification" width="130" name="revert_button"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml
index b2f61fde71..8207fd7735 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml
@@ -32,7 +32,7 @@
<panel name="button_row">
<button label="Créer" label_selected="Nouveau groupe" name="btn_create"/>
<button label="Chat de groupe" name="btn_chat"/>
- <button label="Appel de groupe" name="btn_call"/>
+ <button label="Appel de groupe" width="100" name="btn_call"/>
<button label="Enregistrer" label_selected="Enregistrer" name="btn_apply"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_land_money.xml b/indra/newview/skins/default/xui/fr/panel_group_land_money.xml
index 3ca22b6e21..02b14cb859 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_land_money.xml
@@ -16,13 +16,13 @@
<text name="group_land_heading">
Terrain du groupe
</text>
- <scroll_list name="group_parcel_list">
- <column label="Parcelle" name="name"/>
- <column label="Région" name="location"/>
- <column label="Type" name="type"/>
- <column label="Surface" name="area"/>
- <column label="" name="hidden"/>
- </scroll_list>
+ <scroll_list name="group_parcel_list" width="310">
+ <column label="Parcelle" name="name" width="76" />
+ <column label="Région" name="location" width="78" />
+ <column label="Type" name="type" width="70" />
+ <column label="Surface" name="area" width="50" />
+ <column label="" name="hidden" width="-1" />
+ </scroll_list>
<button label="Carte" label_selected="Carte" name="map_button"/>
<text name="total_contributed_land_label">
Total des contributions :
diff --git a/indra/newview/skins/default/xui/fr/panel_group_notices.xml b/indra/newview/skins/default/xui/fr/panel_group_notices.xml
index 1ec63cf027..68c74f9322 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_notices.xml
@@ -27,23 +27,23 @@ Vous pouvez désactiver la réception des notices dans l&apos;onglet Général.
<text name="lbl">
Créer une notice
</text>
- <text bottom_delta="-79" left="20" name="lbl3">
+ <text name="lbl3">
Sujet :
</text>
- <line_editor left_delta="61" name="create_subject" width="331"/>
- <text left="20" name="lbl4">
+ <line_editor name="create_subject" />
+ <text name="lbl4">
Message :
</text>
- <text_editor bottom_delta="-90" height="104" left_delta="61" name="create_message" width="330"/>
- <text name="lbl5" width="68">
+ <text_editor name="create_message"/>
+ <text name="lbl5" >
Pièce-jointe :
</text>
- <line_editor left_delta="74" name="create_inventory_name" width="190"/>
+ <line_editor name="create_inventory_name"/>
<text name="string">
Faire glisser l&apos;objet et le déposer ici pour le joindre :
</text>
- <button label="Supprimer" label_selected="Supprimer pièce-jointe" left="274" name="remove_attachment" width="140"/>
- <button label="Envoyer" label_selected="Envoyer" left="274" name="send_notice" width="140"/>
+ <button label="Supprimer" label_selected="Supprimer pièce-jointe" name="remove_attachment"/>
+ <button label="Envoyer" label_selected="Envoyer" left="200" name="send_notice" width="100"/>
<group_drop_target name="drop_target" tool_tip="Faites glisser un objet de l&apos;inventaire jusqu&apos;à cette case pour l&apos;envoyer avec la notice. Vous devez avoir l&apos;autorisation de copier et transférer l&apos;objet pour pouvoir le joindre."/>
</panel>
<panel label="Voir ancienne notice" name="panel_view_past_notice">
diff --git a/indra/newview/skins/default/xui/fr/panel_group_roles.xml b/indra/newview/skins/default/xui/fr/panel_group_roles.xml
index d0c9f2f302..400d4d6aee 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_roles.xml
@@ -6,14 +6,14 @@
<panel.string name="want_apply_text">
Voulez-vous enregistrer vos modifications ?
</panel.string>
- <tab_container height="164" name="roles_tab_container">
- <panel height="148" label="MEMBRES" name="members_sub_tab" tool_tip="Membres">
+ <tab_container name="roles_tab_container">
+ <panel label="MEMBRES" name="members_sub_tab" tool_tip="Membres">
<panel.string name="help_text">
Vous pouvez ajouter ou supprimer les rôles assignés aux membres.
Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la touche Ctrl enfoncée.
</panel.string>
<filter_editor label="Filtrer les membres" name="filter_input"/>
- <name_list bottom_delta="-105" height="104" name="member_list">
+ <name_list name="member_list">
<name_list.columns label="Membre" name="name"/>
<name_list.columns label="Donation" name="donated" width="116"/>
<name_list.columns label="Statut" name="online" width="136"/>
@@ -21,7 +21,7 @@ Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la to
<button label="Inviter" name="member_invite" width="165"/>
<button label="Expulser" name="member_eject"/>
</panel>
- <panel height="148" label="RÔLES" name="roles_sub_tab">
+ <panel label="RÔLES" name="roles_sub_tab">
<panel.string name="help_text">
Chaque rôle possède un titre et des
pouvoirs. Les membres peuvent avoir
@@ -41,13 +41,13 @@ notamment les rôles Tous et Propriétaire.
Checkbox_Off
</panel.string>
<filter_editor label="Filtrer les rôles" name="filter_input"/>
- <scroll_list bottom_delta="-104" height="104" name="role_list">
+ <scroll_list name="role_list">
<scroll_list.columns label="Rôle" name="name"/>
<scroll_list.columns label="Titre" name="title"/>
<scroll_list.columns label="#" name="members"/>
</scroll_list>
<button label="Nouveau rôle" name="role_create"/>
- <button label="Supprimer le rôle" name="role_delete"/>
+ <button label="Supprimer le rôle" width="120" name="role_delete"/>
</panel>
<panel height="148" label="POUVOIRS" name="actions_sub_tab" tool_tip="Vous pouvez afficher une description du pouvoir et voir quels membres et rôles peuvent s&apos;en servir.">
<panel.string name="help_text">
diff --git a/indra/newview/skins/default/xui/fr/panel_groups.xml b/indra/newview/skins/default/xui/fr/panel_groups.xml
index 98320656fb..4cda98b9f7 100644
--- a/indra/newview/skins/default/xui/fr/panel_groups.xml
+++ b/indra/newview/skins/default/xui/fr/panel_groups.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="groups">
<scroll_list bottom="50" name="group list"/>
- <text bottom="16" height="32" name="groupdesc" width="268">
+ <text name="groupdesc">
Le groupe actif est en gras.
</text>
- <text bottom="3" name="groupcount">
+ <text name="groupcount" width="280">
Vous appartenez à [COUNT] groupes ([MAX] max).
</text>
<button label="IM/Appel" name="IM" tool_tip="Ouvrir une session de messagerie instantanée"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml
index 8f0561d243..75648d3541 100644
--- a/indra/newview/skins/default/xui/fr/panel_login.xml
+++ b/indra/newview/skins/default/xui/fr/panel_login.xml
@@ -23,7 +23,7 @@
<text name="start_location_text">
Commencer à :
</text>
- <combo_box name="start_location_combo">
+ <combo_box name="start_location_combo" width="152">
<combo_box.item label="Dernier emplacement" name="MyLastLocation"/>
<combo_box.item label="Domicile" name="MyHome"/>
<combo_box.item label="&lt;Saisissez le nom de la région&gt;" name="Typeregionname"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_media_settings_security.xml b/indra/newview/skins/default/xui/fr/panel_media_settings_security.xml
index 36d5f4e860..9d070b7aff 100644
--- a/indra/newview/skins/default/xui/fr/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/fr/panel_media_settings_security.xml
@@ -2,7 +2,8 @@
<panel label="Sécurité" name="Media Settings Security">
<check_box initial_value="false" label="Autoriser l&apos;accès aux styles d&apos;URL spécifiés uniquement" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
- Les entrées par lesquelles la page d&apos;accueil est rejetée sont indiquées :
+ Les entrées par lesquelles la page
+d&apos;accueil est rejetée sont indiquées :
</text>
<button label="Ajouter" name="whitelist_add"/>
<button label="Supprimer" name="whitelist_del"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml b/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml
index fa1ddd2430..f1a7ebb35c 100644
--- a/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml
@@ -2,8 +2,8 @@
<!-- All our XML is utf-8 encoded. -->
<panel name="nearby_chat">
<panel name="chat_caption">
- <text name="sender_name">
- CHAT PRÈS DE VOUS
- </text>
+ <text
+ name="sender_name"
+width="170">CHAT PRÈS DE VOUS</text>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_notes.xml b/indra/newview/skins/default/xui/fr/panel_notes.xml
index b1be274616..ba052a0e07 100644
--- a/indra/newview/skins/default/xui/fr/panel_notes.xml
+++ b/indra/newview/skins/default/xui/fr/panel_notes.xml
@@ -14,8 +14,8 @@
</layout_panel>
<layout_panel name="notes_buttons_panel">
<button label="Devenir amis" name="add_friend" tool_tip="Proposer à ce résident de devenir votre ami"/>
- <button label="IM" name="im" tool_tip="Ouvrir une session IM"/>
- <button label="Appeler" name="call" tool_tip="Appeler ce résident"/>
+ <button label="IM" name="im" width="30" tool_tip="Ouvrir une session IM"/>
+ <button label="Appeler" name="call" width="60" tool_tip="Appeler ce résident"/>
<button label="Carte" name="show_on_map_btn" tool_tip="Afficher le résident sur la carte"/>
<button label="Téléporter" name="teleport" tool_tip="Proposez une téléportation"/>
</layout_panel>
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 04abcc8aad..0c0cc29e7a 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
@@ -9,7 +9,7 @@
<check_box label="Bulles de chat" name="bubble_text_chat"/>
<color_swatch name="background" tool_tip="Choisir la couleur des bulles de chat"/>
<slider label="Opacité" name="bubble_chat_opacity"/>
- <text name="AspectRatioLabel1" tool_tip="largeur/hauteur">
+ <text width="140" name="AspectRatioLabel1" tool_tip="largeur/hauteur">
Rapport hauteur/largeur
</text>
<combo_box name="aspect_ratio" tool_tip="largeur/hauteur">
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
index 4459244395..9576119eb5 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
@@ -17,7 +17,7 @@
<text name="QualitySpeed">
Qualité et vitesse :
</text>
- <text left="105" name="FasterText">
+ <text left="35" name="FasterText">
Plus rapide
</text>
<text name="BetterText">
@@ -62,7 +62,7 @@
<text name="DrawDistanceMeterText2">
m
</text>
- <slider label="Nombre de particules max. :" label_width="143" name="MaxParticleCount"/>
+ <slider label="Nombre de particules max. :" label_width="147" name="MaxParticleCount"/>
<slider label="Qualité post-traitement :" name="RenderPostProcess"/>
<text name="MeshDetailText">
Détails des rendus :
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
index 68a735df90..d477a9532d 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
@@ -18,7 +18,7 @@
kbps
</text>
<check_box label="Port de connexion personnalisé" name="connection_port_enabled"/>
- <spinner label="Numéro de port :" name="web_proxy_port"/>
+ <spinner label="Numéro de port :" label_width="95" name="web_proxy_port" width="170"/>
<text name="cache_size_label_l">
Taille de la mémoire
</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_profile.xml b/indra/newview/skins/default/xui/fr/panel_profile.xml
index 0c33a0f1e0..19c6a3b090 100644
--- a/indra/newview/skins/default/xui/fr/panel_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_profile.xml
@@ -39,8 +39,8 @@
</layout_panel>
<layout_panel name="profile_buttons_panel">
<button label="Devenir amis" name="add_friend" tool_tip="Proposer à ce résident de devenir votre ami"/>
- <button label="IM" name="im" tool_tip="Ouvrir une session IM"/>
- <button label="Appeler" name="call" tool_tip="Appeler ce résident"/>
+ <button label="IM" name="im" width="30" tool_tip="Ouvrir une session IM"/>
+ <button label="Appeler" name="call" width="60" tool_tip="Appeler ce résident"/>
<button label="Carte" name="show_on_map_btn" tool_tip="Afficher le résident sur la carte"/>
<button label="Téléporter" name="teleport" tool_tip="Proposez une téléportation"/>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_covenant.xml b/indra/newview/skins/default/xui/fr/panel_region_covenant.xml
index cf9f4e0fd0..cd1d0c4886 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_covenant.xml
@@ -18,7 +18,7 @@
<text name="estate_cov_lbl">
Règlement :
</text>
- <text name="covenant_timestamp_text">
+ <text name="covenant_timestamp_text" width="350">
Dernière modification le mercredi 31 décembre 1969 16:00:00
</text>
<button label="?" name="covenant_help"/>
@@ -27,8 +27,8 @@
</text_editor>
<button label="Réinitialiser" name="reset_covenant"/>
<text name="covenant_help_text">
- Les changements apportés au règlement apparaîtront sur toutes
- les parcelles du domaine.
+ Les changements apportés au règlement apparaîtront sur
+toutes les parcelles du domaine.
</text>
<text bottom_delta="-31" name="covenant_instructions">
Faire glisser une note pour changer le règlement de ce domaine.
diff --git a/indra/newview/skins/default/xui/fr/panel_region_debug.xml b/indra/newview/skins/default/xui/fr/panel_region_debug.xml
index 0fabf92889..cb4a74e142 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_debug.xml
@@ -13,7 +13,7 @@
<check_box label="Désactiver la physique" name="disable_physics_check" tool_tip="Désactiver tous les effets liés à la physique dans cette région"/>
<button label="?" name="disable_physics_help"/>
<button bottom_delta="-38" label="Appliquer" name="apply_btn"/>
- <text bottom_delta="-42" name="objret_text_lbl">
+ <text bottom_delta="-42" name="objret_text_lbl" width="260">
Renvoi de l&apos;objet
</text>
<text name="resident_text_lbl">
diff --git a/indra/newview/skins/default/xui/fr/panel_region_estate.xml b/indra/newview/skins/default/xui/fr/panel_region_estate.xml
index a0282dd940..f9262ea478 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_estate.xml
@@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Domaine" name="Estate">
<text bottom="-34" name="estate_help_text">
- Les modifications des paramètres de cet onglet affecteront toutes les régions du domaine.
+ Les modifications des paramètres de cet
+onglet affecteront toutes les régions du
+domaine.
</text>
- <text bottom_delta="-34" name="estate_text">
+ <text top_pad="8" bottom_delta="-34" name="estate_text">
Domaine :
</text>
<text name="estate_name">
diff --git a/indra/newview/skins/default/xui/fr/panel_region_general.xml b/indra/newview/skins/default/xui/fr/panel_region_general.xml
index 8a59adbd93..711278d614 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_general.xml
@@ -32,9 +32,9 @@
<button label="?" name="parcel_changes_help"/>
<check_box label="Ne pas afficher dans la recherche" name="block_parcel_search_check" tool_tip="Afficher cette région et ses parcelles dans les résultats de recherche"/>
<button label="?" name="parcel_search_help"/>
- <spinner label="Nombre maximum d&apos;avatars" label_width="127" name="agent_limit_spin" width="190"/>
+ <spinner label="Nombre maximum d&apos;avatars" name="agent_limit_spin" label_width="160" width="240"/>
<button label="?" name="agent_limit_help"/>
- <spinner label="Bonus objet" label_width="127" name="object_bonus_spin" width="190"/>
+ <spinner label="Bonus objet" name="object_bonus_spin" label_width="160" width="240"/>
<button label="?" name="object_bonus_help"/>
<text label="Maturité" name="access_text">
Catégorie :
diff --git a/indra/newview/skins/default/xui/fr/panel_region_general_layout.xml b/indra/newview/skins/default/xui/fr/panel_region_general_layout.xml
index 0e72bbc9f5..e709100fa2 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_general_layout.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_general_layout.xml
@@ -3,19 +3,19 @@
<text name="region_text_lbl">
Région :
</text>
- <text name="region_text">
+ <text name="region_text" left_delta="56">
inconnu
</text>
<text name="version_channel_text_lbl">
Version :
</text>
- <text name="version_channel_text">
+ <text name="version_channel_text" left_delta="56">
inconnu
</text>
<text name="region_type_lbl">
Type :
</text>
- <text name="region_type">
+ <text name="region_type" left_delta="56">
inconnu
</text>
<check_box label="Interdire le terraformage" name="block_terraform_check"/>
@@ -25,8 +25,8 @@
<check_box label="Autoriser la revente de terrains" name="allow_land_resell_check"/>
<check_box label="Autoriser la fusion/division de terrains" name="allow_parcel_changes_check"/>
<check_box label="Interdire l&apos;affichage du terrain dans les recherches" name="block_parcel_search_check" tool_tip="Permettre aux autres résidents de voir cette région et ses parcelles dans les résultats de recherche"/>
- <spinner label="Nombre maximum d&apos;avatars" name="agent_limit_spin"/>
- <spinner label="Bonus objet" name="object_bonus_spin"/>
+ <spinner label="Nombre maximum d&apos;avatars" name="agent_limit_spin" label_width="160" width="240"/>
+ <spinner label="Bonus objet" name="object_bonus_spin" label_width="160" width="240"/>
<text label="Accès" name="access_text">
Catégorie :
</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_texture.xml b/indra/newview/skins/default/xui/fr/panel_region_texture.xml
index a7abb49b1a..e95d911c01 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_texture.xml
@@ -39,7 +39,7 @@
<text name="height_text_lbl9">
Nord-est
</text>
- <text name="height_text_lbl10">
+ <text name="height_text_lbl10" width="460">
Ces valeurs représentent les limites de mélange pour les textures ci-dessus.
</text>
<text name="height_text_lbl11">
diff --git a/indra/newview/skins/default/xui/fr/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/fr/panel_script_limits_my_avatar.xml
index 24656bf379..47d8382e57 100644
--- a/indra/newview/skins/default/xui/fr/panel_script_limits_my_avatar.xml
+++ b/indra/newview/skins/default/xui/fr/panel_script_limits_my_avatar.xml
@@ -4,7 +4,7 @@
Chargement...
</text>
<scroll_list name="scripts_list">
- <scroll_list.columns label="Taille (Ko)" name="size"/>
+ <scroll_list.columns label="Taille (Ko)" width="80" name="size"/>
<scroll_list.columns label="URL" name="urls"/>
<scroll_list.columns label="Nom de l&apos;objet" name="name"/>
<scroll_list.columns label="Endroit" name="location"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/fr/panel_script_limits_region_memory.xml
index 1e5e680c09..9426047ee1 100644
--- a/indra/newview/skins/default/xui/fr/panel_script_limits_region_memory.xml
+++ b/indra/newview/skins/default/xui/fr/panel_script_limits_region_memory.xml
@@ -13,9 +13,9 @@
Chargement...
</text>
<scroll_list name="scripts_list">
- <scroll_list.columns label="Taille (Ko)" name="size"/>
+ <scroll_list.columns label="Taille (Ko)" width="80" name="size"/>
<scroll_list.columns label="Nom de l&apos;objet" name="name"/>
- <scroll_list.columns label="Propriétaire d&apos;objet" name="owner"/>
+ <scroll_list.columns label="Propriétaire d&apos;objet" width="140" name="owner"/>
<scroll_list.columns label="Parcelle/emplacement" name="location"/>
</scroll_list>
<button label="Rafraîchir la liste" name="refresh_list_btn"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_side_tray.xml b/indra/newview/skins/default/xui/fr/panel_side_tray.xml
index 3ad1671921..6329324a23 100644
--- a/indra/newview/skins/default/xui/fr/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/fr/panel_side_tray.xml
@@ -2,26 +2,26 @@
<!-- Side tray cannot show background because it is always
partially on screen to hold tab buttons. -->
<side_tray name="sidebar">
- <sidetray_tab description="Activer/désactiver le panneau latéral." name="sidebar_openclose"/>
- <sidetray_tab description="Domicile." name="sidebar_home">
+ <sidetray_tab description="Activer/désactiver le panneau latéral." name="sidebar_openclose" tab_title="Activer/désactiver le panneau latéral"/>
+ <sidetray_tab description="Domicile." name="sidebar_home" tab_title="Accueil">
<panel label="domicile" name="panel_home"/>
</sidetray_tab>
- <sidetray_tab description="Modifiez votre profil public et vos Favoris." name="sidebar_me">
+ <sidetray_tab description="Modifiez votre profil public et vos Favoris." name="sidebar_me" tab_title="Mon profil">
<panel label="Moi" name="panel_me"/>
</sidetray_tab>
- <sidetray_tab description="Trouvez vos amis, vos contacts et les personnes se trouvant près de vous." name="sidebar_people">
+ <sidetray_tab description="Trouvez vos amis, vos contacts et les personnes se trouvant près de vous." name="sidebar_people" tab_title="Personnes">
<panel_container name="panel_container">
<panel label="Profil du groupe" name="panel_group_info_sidetray"/>
<panel label="Résidents et objets ignorés" name="panel_block_list_sidetray"/>
</panel_container>
</sidetray_tab>
- <sidetray_tab description="Trouvez de nouveaux lieux à découvrir et les lieux que vous connaissez déjà." label="Lieux" name="sidebar_places">
+ <sidetray_tab description="Trouvez de nouveaux lieux à découvrir et les lieux que vous connaissez déjà." label="Lieux" name="sidebar_places" tab_title="Endroits">
<panel label="Lieux" name="panel_places"/>
</sidetray_tab>
- <sidetray_tab description="Parcourez votre inventaire." name="sidebar_inventory">
+ <sidetray_tab description="Parcourez votre inventaire." name="sidebar_inventory" tab_title="Mon inventaire">
<panel label="Modifier l&apos;inventaire" name="sidepanel_inventory"/>
</sidetray_tab>
- <sidetray_tab description="Modifiez votre apparence actuelle." name="sidebar_appearance">
+ <sidetray_tab description="Modifiez votre apparence actuelle." name="sidebar_appearance" tab_title="Mon apparence">
<panel label="Changer d&apos;apparence" name="sidepanel_appearance"/>
</sidetray_tab>
</side_tray>
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 1888dc1827..c6f73dde21 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -1486,8 +1486,8 @@
<string name="covenant_last_modified">
Dernière modification :
</string>
- <string name="none_text" value=" (aucun) "/>
- <string name="never_text" value=" (jamais) "/>
+ <string name="none_text" value=" (aucun)"/>
+ <string name="never_text" value=" (jamais)"/>
<string name="GroupOwned">
Propriété du groupe
</string>
diff --git a/indra/newview/skins/default/xui/ja/floater_about.xml b/indra/newview/skins/default/xui/ja/floater_about.xml
index 0fa20ab1ac..78bc355f4b 100644
--- a/indra/newview/skins/default/xui/ja/floater_about.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about.xml
@@ -61,7 +61,8 @@ Vivox ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [VIVOX_VERSION]
FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
GL Copyright (C) 1999-2004 Brian Paul.
Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
- jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
+ jpeg2000 Copyright (C) 2001, David Taubman, The University of New South
+ Wales (UNSW)
jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
ogg/vorbis Copyright (C) 2001, Xiphophorus
OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
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 71a38391cd..b3278a8f9e 100644
--- a/indra/newview/skins/default/xui/ja/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml
@@ -97,7 +97,7 @@
<text name="For Sale: Price L$[PRICE].">
価格: L$[PRICE] (L$[PRICE_PER_SQM]/平方メートル)
</text>
- <button label="土地を売る" label_selected="土地を販売..." name="Sell Land..."/>
+ <button label="土地を売る" label_selected="土地を販売..." name="Sell Land..." width="100"/>
<text name="For sale to">
販売先:[BUYER]
</text>
@@ -107,7 +107,7 @@
<text name="Selling with no objects in parcel.">
オブジェクトã¯è²©å£²ã—ãªã„
</text>
- <button label="土地販売ã®å–り消ã—" label_selected="土地販売ã®å–り消ã—" name="Cancel Land Sale"/>
+ <button label="土地販売ã®å–り消ã—" label_selected="土地販売ã®å–り消ã—" name="Cancel Land Sale" width="100"/>
<text name="Claimed:">
å–得日時:
</text>
@@ -126,10 +126,10 @@
<text name="DwellText">
誤
</text>
- <button label="土地ã®è³¼å…¥" label_selected="土地を購入..." left="130" name="Buy Land..." width="125"/>
- <button label="スクリプト情報" name="Scripts..."/>
+ <button label="土地ã®è³¼å…¥" label_selected="土地を購入..." left="130" name="Buy Land..." width="100"/>
+ <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="125"/>
+ <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="土地ãŒæ‰€æœ‰ã•ã‚Œã¦ãŠã‚Šã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚オークションã®å¯¾è±¡ã«ãªã£ã¦ã„ãªã„ã“ã¨ã‚‚å¿…è¦æ¡ä»¶ã§ã™ã€‚"/>
@@ -206,7 +206,7 @@
[MAX]ã®å†…[COUNT]([DELETED]を削除)
</panel.string>
<text name="parcel_object_bonus">
- 地域オブジェクトボーナスè¦å› : [BONUS]
+ オブジェクトボーナス: [BONUS]
</text>
<text name="Simulator primitive usage:" width="500">
プリム使用状æ³ï¼š
@@ -263,7 +263,7 @@
<text name="Object Owners:" width="150">
オブジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ï¼š
</text>
- <button label="リスト更新" label_selected="リスト更新" left="146" name="Refresh List" tool_tip="オブジェクトã®ãƒªã‚¹ãƒˆã‚’æ›´æ–°"/>
+ <button label="リスト更新" label_selected="リスト更新" left="146" name="Refresh List" tool_tip="オブジェクトã®ãƒªã‚¹ãƒˆã‚’æ›´æ–°ã—ã¾ã™"/>
<button label="オブジェクトを返å´ã™ã‚‹" label_selected="オブジェクトã®è¿”å´..." left="256" name="Return objects..."/>
<name_list label="カウント" name="owner list">
<name_list.columns label="タイプ" name="type"/>
@@ -329,8 +329,8 @@
土地オプション:
</text>
<check_box label="安全(ダメージãªã—)" name="check safe" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã“ã®åœŸåœ°ã§ã®ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚³ãƒ³ãƒãƒƒãƒˆãŒç„¡åŠ¹ã«ãªã‚Šã€ã€Œå®‰å…¨ã€ã«è¨­å®šã•ã‚Œã¾ã™ã€‚ ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚³ãƒ³ãƒãƒƒãƒˆãŒæœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚"/>
- <check_box label="プッシングを制é™" name="PushRestrictCheck" tool_tip="スクリプトã«ã‚ˆã‚‹ãƒ—ッシングを制é™ã—ã¾ã™ã€‚ ã“ã®ã‚ªãƒ—ションをé¸æŠžã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚ãªãŸã®åœŸåœ°ã§ã®ç ´å£Šçš„行動を妨ã’ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/>
- <check_box label="検索ã«åŒºç”»ã‚’表示(週 L$30)" name="ShowDirectoryCheck" tool_tip="検索çµæžœã§ã“ã®åŒºç”»ã‚’表示ã•ã›ã‚‹"/>
+ <check_box label="プッシングを制é™" name="PushRestrictCheck" tool_tip="スクリプトã«ã‚ˆã‚‹ãƒ—ッシングを制é™ã—ã¾ã™ã€‚ ã“ã®ã‚ªãƒ—ションをé¸æŠžã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚ãªãŸã®åœŸåœ°ã§ã®ç ´å£Šçš„行動を防ãã“ã¨ãŒã§ãã¾ã™ã€‚"/>
+ <check_box label="検索ã«åŒºç”»ã‚’表示(週 L$30)" name="ShowDirectoryCheck" tool_tip="ã“ã®åŒºç”»ã‚’検索çµæžœã«è¡¨ç¤ºã—ã¾ã™"/>
<combo_box name="land category with adult">
<combo_box.item label="全カテゴリ" name="item0"/>
<combo_box.item label="Linden所在地" name="item1"/>
@@ -364,7 +364,7 @@
<text name="Snapshot:">
スナップショット:
</text>
- <texture_picker label="" left="116" name="snapshot_ctrl" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
+ <texture_picker label="" name="snapshot_ctrl" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
<text name="landing_point">
ç€åœ°ç‚¹: [LANDING]
</text>
@@ -383,7 +383,7 @@
<text name="with media:">
種類:
</text>
- <combo_box name="media type" tool_tip="URL ãŒå‹•ç”»ã€ã‚¦ã‚§ãƒ–・ページã€ãã®ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã®å ´åˆã«æŒ‡å®šã—ã¾ã™"/>
+ <combo_box name="media type" tool_tip="URL ãŒå‹•ç”»ã€Webページã€ãã®ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã®å ´åˆã«æŒ‡å®šã—ã¾ã™"/>
<text name="at URL:">
ホームページ:
</text>
@@ -396,20 +396,20 @@
<text name="Description:">
説明:
</text>
- <line_editor name="url_description" tool_tip="ï¼»å†ç”Ÿï¼½/[ロード]ボタンã®éš£ã«è¡¨ç¤ºã•ã‚Œã‚‹ãƒ†ã‚­ã‚¹ãƒˆ"/>
+ <line_editor name="url_description" tool_tip="「å†ç”Ÿã€ã€Œãƒ­ãƒ¼ãƒ‰ã€ãƒœã‚¿ãƒ³ã®éš£ã«è¡¨ç¤ºã•ã‚Œã‚‹ãƒ†ã‚­ã‚¹ãƒˆã§ã™"/>
<text name="Media texture:">
- テクスãƒãƒ£ã®ç½®ãæ›ãˆï¼š
+ テクスãƒãƒ£ç½®ãæ›ãˆï¼š
</text>
- <texture_picker label="" name="media texture" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
+ <texture_picker label="" name="media texture" tool_tip="写真をクリックã—ã¦é¸æŠž" left="120"/>
<text name="replace_texture_help" width="290">
ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’使用ã™ã‚‹ã‚ªãƒ–ジェクトã®ãƒ—レイをクリックã™ã‚‹ã¨ã€ãƒ ãƒ¼ãƒ“ーや Web ページを表示ã—ã¾ã™ã€‚ テクスãƒãƒ£ã‚’変更ã™ã‚‹ã«ã¯ã‚µãƒ ãƒã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„。
</text>
<check_box label="スケールを自動設定" name="media_auto_scale" tool_tip="ã“ã®ã‚ªãƒ—ションをãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€ã“ã®åŒºç”»ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ã‚¹ã‚±ãƒ¼ãƒ«ãŒè‡ªå‹•çš„ã«è¨­å®šã•ã‚Œã¾ã™ã€‚ 動作速度ã¨ç”»è³ªãŒå°‘ã—低下ã™ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ãŒã€ä»–ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ã®ã‚¹ã‚±ãƒ¼ãƒªãƒ³ã‚°ã‚„整列ãŒå¿…è¦ã«ãªã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。"/>
- <text name="media_size" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚">
+ <text name="media_size" tool_tip="レンダリングã™ã‚‹Webメディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚">
サイズ:
</text>
- <spinner name="media_size_width" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/>
- <spinner name="media_size_height" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/>
+ <spinner name="media_size_width" tool_tip="レンダリングã™ã‚‹Webメディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/>
+ <spinner name="media_size_height" tool_tip="レンダリングã™ã‚‹Webメディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/>
<text name="pixels">
ピクセル
</text>
@@ -425,13 +425,13 @@
<text name="Sound:">
サウンド:
</text>
- <check_box label="ジェスãƒãƒ£ãƒ¼ã¨ã‚ªãƒ–ジェクトã®éŸ³ã‚’ã“ã®åŒºç”»ã ã‘ã«é™å®š" name="check sound local"/>
+ <check_box label="ジェスãƒãƒ£ãƒ¼ã¨ã‚ªãƒ–ジェクトã®éŸ³ã‚’ã“ã®åŒºç”»ã ã‘ã«é™å®šã™ã‚‹" name="check sound local"/>
<text name="Voice settings:">
ボイス:
</text>
<check_box label="ボイスを有効ã«ã™ã‚‹" name="parcel_enable_voice_channel"/>
<check_box label="ボイスを有効ã«ã™ã‚‹ï¼ˆä¸å‹•ç”£è¨­å®šï¼‰" name="parcel_enable_voice_channel_is_estate_disabled"/>
- <check_box label="ã“ã®åŒºç”»ã§ã®ãƒœã‚¤ã‚¹ä½¿ç”¨ã‚’制é™" name="parcel_enable_voice_channel_parcel"/>
+ <check_box label="ボイスをã“ã®åŒºç”»ã«é™å®šã™ã‚‹" name="parcel_enable_voice_channel_parcel"/>
</panel>
<panel label="アクセス" name="land_access_panel">
<panel.string name="access_estate_defined">
@@ -441,16 +441,16 @@
1ã¤ä»¥ä¸Šã®ã‚ªãƒ—ションãŒã€ä¸å‹•ç”£ãƒ¬ãƒ™ãƒ«ã§è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚
</panel.string>
<text name="Limit access to this parcel to:">
- ã“ã®åŒºç”»ã«ã‚¢ã‚¯ã‚»ã‚¹
+ ã“ã®åŒºç”»ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹
</text>
- <check_box label="ãƒ‘ãƒ–ãƒªãƒƒã‚¯ã‚¢ã‚¯ã‚»ã‚¹ã‚’è¨±å¯ [MATURITY]" name="public_access"/>
+ <check_box label="パブリックアクセスを許å¯ã™ã‚‹ [MATURITY]" name="public_access"/>
<text name="Only Allow">
- 次ã®ä½äººã®ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢ï¼š
+ 次ã®ä½äººã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ï¼š
</text>
<check_box label="支払情報登録済 [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="未確èªã®ä½äººã®ç«‹å…¥ã‚’ç¦æ­¢ã—ã¾ã™ã€‚"/>
<check_box label="å¹´é½¢ç¢ºèª [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ä½äººã®ç«‹å…¥ã‚’ç¦æ­¢ã—ã¾ã™ã€‚ 詳ã—ã„情報㯠[SUPPORT_SITE] ã‚’ã”覧下ã•ã„。"/>
- <check_box label="グループ・アクセスを許å¯ï¼š[GROUP]" name="GroupCheck" tool_tip="[一般]タブã§ã€ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„。"/>
- <check_box label="入場許å¯ã‚’販売:" name="PassCheck" tool_tip="ã“ã®åŒºç”»ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯"/>
+ <check_box label="グループã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ï¼š[GROUP]" name="GroupCheck" tool_tip="[一般]タブã§ã€ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„。"/>
+ <check_box label="入場許å¯ã‚’販売:" name="PassCheck" tool_tip="ã“ã®åŒºç”»ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¾ã™"/>
<combo_box name="pass_combo">
<combo_box.item label="誰ã§ã‚‚" name="Anyone"/>
<combo_box.item label="グループ" name="Group"/>
@@ -467,7 +467,7 @@
</panel>
<panel name="Banned_layout_panel">
<text label="ç¦æ­¢" name="BanCheck">
- ç«‹å…¥ç¦æ­¢ã•ã‚ŒãŸä½äºº
+ 立入をç¦æ­¢ã•ã‚ŒãŸä½äºº
</text>
<name_list name="BannedList" tool_tip="(åˆè¨ˆ [LISTED] 人ã€æœ€å¤§ [MAX] 人)"/>
<button label="追加" name="add_banned"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_animation_preview.xml b/indra/newview/skins/default/xui/ja/floater_animation_preview.xml
index c355924f33..4674df8bec 100644
--- a/indra/newview/skins/default/xui/ja/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_animation_preview.xml
@@ -114,8 +114,8 @@
</text>
<spinner label="優先順ä½" name="priority" tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãŒã©ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’上書ãã™ã‚‹ã‹ã‚’決ã‚ã¾ã™"/>
<check_box label="ループ" name="loop_check" tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ループå†ç”Ÿã—ã¾ã™"/>
- <spinner label="イン(ï¼…)" label_width="45" left="70" name="loop_in_point" tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—復帰点を設定ã—ã¾ã™" width="100"/>
- <spinner label="アウト(ï¼…)" label_width="60" left="170" name="loop_out_point" tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—終了点を設定ã—ã¾ã™" width="100"/>
+ <spinner label="イン(ï¼…)" label_width="45" left="60" name="loop_in_point" tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—復帰点を設定ã—ã¾ã™" width="100"/>
+ <spinner label="アウト(ï¼…)" label_width="50" left="170" name="loop_out_point" tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—終了点を設定ã—ã¾ã™" width="100"/>
<text name="hand_label">
手ã®å‹•ã
</text>
@@ -168,17 +168,17 @@
<combo_box.item label="座る" name="Sitting"/>
<combo_box.item label="飛ã¶" name="Flying"/>
</combo_box>
- <spinner label="フェーズイï¾(秒)" name="ease_in_time" tool_tip="アニメーションã®ãƒ–レンドイン時間(秒)"/>
- <spinner label="フェーズアウト(秒)" name="ease_out_time" tool_tip="アニメーションã®ãƒ–レンドアウト時間(秒)"/>
+ <spinner label="イーズイン(秒)" name="ease_in_time" tool_tip="アニメーションã®ãƒ–レンドイン時間(秒)"/>
+ <spinner label="イーズアウト(秒)" name="ease_out_time" tool_tip="アニメーションã®ãƒ–レンドアウト時間(秒)"/>
<button label="" name="play_btn" tool_tip="アニメーションをå†ç”Ÿã™ã‚‹"/>
<button name="pause_btn" tool_tip="アニメーションを一時åœæ­¢ã™ã‚‹"/>
<button label="" name="stop_btn" tool_tip="アニメーションã®å†ç”Ÿã‚’åœæ­¢"/>
<slider label="" name="playback_slider"/>
<text name="bad_animation_text">
- アニメーション・ファイルを読ã¿è¾¼ã‚ã¾ã›ã‚“。
+ アニメーションファイルを読ã¿è¾¼ã‚ã¾ã›ã‚“。
Poser 4ã‹ã‚‰ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•ã‚ŒãŸBVHファイルを推奨ã—ã¾ã™ã€‚
</text>
- <button label="アップロードL$[AMOUNT]" name="ok_btn"/>
+ <button label="アップロードL$[AMOUNT]" name="ok_btn"/>
<button label="å–り消ã—" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml b/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml
index a199a10823..0ea913e66a 100644
--- a/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml
@@ -3,13 +3,13 @@
<floater.string name="InvalidAvatar">
無効ãªã‚¢ãƒã‚¿ãƒ¼
</floater.string>
- <text name="label">
+ <text name="label" width="100">
ベークドテクスãƒãƒ£
</text>
<text name="composite_label" width="128">
- åˆæˆãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼
+ åˆæˆãƒ†ã‚¯ã‚¹ãƒãƒ£
</text>
- <button label="テクスãƒãƒ£ID一覧をコンソールã«æ›¸ã込む" label_selected="æ¨ã¦ã‚‹" name="Dump"/>
+ <button label="テクスãƒãƒ£ID一覧をコンソールã«æ›¸ã込む" label_selected="æ¨ã¦ã‚‹" name="Dump" width="200"/>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
<texture_picker label="髪" name="hair-baked"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_build_options.xml b/indra/newview/skins/default/xui/ja/floater_build_options.xml
index 8d3dba3883..9fd788d9cb 100644
--- a/indra/newview/skins/default/xui/ja/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/ja/floater_build_options.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="build options floater" title="グリッドオプション">
<spinner label="グリッドユニット(メートル)" name="GridResolution"/>
- <spinner label="グリッド範囲(メートル)" name="GridDrawSize"/>
+ <spinner label="グリッド゙範囲(メートル)" name="GridDrawSize"/>
<check_box label="サブユニットã«ã‚¹ãƒŠãƒƒãƒ—" name="GridSubUnit"/>
<check_box label="横断é¢ã‚’表示" name="GridCrossSection"/>
<text name="grid_opacity_label" tool_tip="グリッドã®é€æ˜Žåº¦">
diff --git a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml
index fbbbd85890..be24960c6e 100644
--- a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterbulkperms" title="コンテンツ権é™ã®ç·¨é›†">
+<floater name="floaterbulkperms" title="中身ã®æ¨©é™ã®ç·¨é›†">
<floater.string name="nothing_to_modify_text">
- é¸æŠžã—ãŸä¸­ã«ç·¨é›†ã§ããªã„コンテンツãŒå«ã¾ã‚Œã¦ã„ã¾ã™
+ é¸æŠžã—ãŸä¸­ã«ç·¨é›†ã§ããªã„ã‚‚ã®ãŒå«ã¾ã‚Œã¦ã„ã¾ã™
</floater.string>
<floater.string name="status_text">
[NAME]ã«æ¨©é™ã‚’設定中ã§ã™ã€‚
@@ -28,12 +28,12 @@
<icon name="icon_script" tool_tip="スクリプト"/>
<check_box label="サウンド" name="check_sound"/>
<icon name="icon_sound" tool_tip="サウンド"/>
- <check_box label="テクスãƒãƒ£ãƒ¼" name="check_texture"/>
+ <check_box label="テクスãƒãƒ£" name="check_texture"/>
<icon name="icon_texture" tool_tip="テクスãƒãƒ£"/>
<button label="ã™ã¹ã¦ã« √" label_selected="å…¨ã¦" name="check_all"/>
<button label="クリア" label_selected="ãªã—" name="check_none"/>
<text name="newperms">
- æ–°ã—ã„コンテンツ権é™
+ æ–°ã—ã„中身ã®æ¨©é™
</text>
<text name="GroupLabel">
グループ:
@@ -43,7 +43,7 @@
全員:
</text>
<check_box label="コピー" name="everyone_copy"/>
- <text name="NextOwnerLabel">
+ <text name="NextOwnerLabel" left="160">
次ã®æ‰€æœ‰è€…:
</text>
<check_box label="修正" name="next_owner_modify"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_contents.xml b/indra/newview/skins/default/xui/ja/floater_buy_contents.xml
index 53b7f24141..69d4faf5b8 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_contents.xml
@@ -1,22 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater min_width="340" name="floater_buy_contents" title="コンテンツã®è³¼å…¥" width="340">
+<floater min_width="340" name="floater_buy_contents" title="中身ã®è³¼å…¥" width="340">
<text name="contains_text" width="320">
- [NAME]ã®å†…容:
+ [NAME]ã®ä¸­èº«ï¼š
</text>
<scroll_list name="item_list" width="310"/>
<text name="buy_text" width="320">
- コンテンツを[NAME]ã‹ã‚‰L$[AMOUNT]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
+ 中身を[NAME]ã‹ã‚‰L$[AMOUNT]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
</text>
<button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn" width="73"/>
<button label="購入" label_selected="購入" left_delta="-77" name="buy_btn" width="73"/>
<check_box label="今ã™ãæœã‚’ç€ã‚‹" left_delta="-125" name="wear_check"/>
<text name="no_copy_text">
- (コピーãªã—)
+ (コピーä¸å¯)
</text>
<text name="no_modify_text">
- (修正ãªã—)
+ (修正ä¸å¯)
</text>
<text name="no_transfer_text">
- (転é€ãªã—)
+ (å†è²©ãƒ»ãƒ—レゼントä¸å¯)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
index ffdcf838d3..32de533dc4 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
@@ -40,13 +40,13 @@
[NAME] L$ [PRICE]
</text>
<text name="total_label">
- æ–°ã—ã„残高
+ 購入後ã®æ®‹é«˜
</text>
<text name="total_amount">
L$ [AMT]
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php?lang=ja-JP payment method] | [http://www.secondlife.com/my/account/currency.php?lang=ja-JP currency] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=ja-JP exchange rate]
+ [http://www.secondlife.com/my/account/payment_method_management.php?lang=ja-JP 支払方法] | [http://www.secondlife.com/my/account/currency.php?lang=ja-JP 通貨] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=ja-JP æ›ç®—レート]
</text>
<text name="exchange_rate_note">
金é¡ã‚’å†å…¥åŠ›ã—ã¦æœ€æ–°æ›ç®—レートを確èªã—ã¾ã™ã€‚
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_land.xml b/indra/newview/skins/default/xui/ja/floater_buy_land.xml
index 13b43d1257..f332c3d988 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_land.xml
@@ -27,10 +27,10 @@
<text name="resellable_changeable_label">
ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ï¼š
</text>
- <text name="resellable_clause">
+ <text name="resellable_clause" left="460">
å†è²©ã§ãã‚‹å ´åˆã¨ã§ããªã„å ´åˆãŒã‚ã‚Šã¾ã™ã€‚
</text>
- <text name="changeable_clause">
+ <text name="changeable_clause" left="460">
çµ±åˆã¾ãŸã¯å†åˆ†å‰²ã§ãã‚‹å ´åˆã¨ã§ããªã„å ´åˆãŒã‚ã‚Šã¾ã™ã€‚
</text>
<text name="covenant_text">
@@ -67,12 +67,12 @@
<text name="error_message">
何ã‹å¤‰ã§ã™
</text>
- <button label="ウェブ・サイトã«ç§»å‹•" name="error_web"/>
+ <button label="Webサイトã«ç§»å‹•" name="error_web"/>
<text name="account_action">
- プレミアム・メンãƒãƒ¼ã«ã‚¢ãƒƒãƒ—グレード
+ プレミアム会員ã«ã‚¢ãƒƒãƒ—グレード
</text>
<text name="account_reason">
- 土地をä¿æœ‰ã§ãã‚‹ã®ã¯ãƒ—レミアム・メンãƒãƒ¼ã ã‘ã§ã™
+ 土地をä¿æœ‰ã§ãã‚‹ã®ã¯ãƒ—レミアム会員ã ã‘ã§ã™
</text>
<combo_box name="account_level">
<combo_box.item label="æœˆé¡ 9.95米ドル〠月払ã„" name="US$9.95/month,billedmonthly"/>
@@ -114,10 +114,10 @@
å†è²©ä¸å¯èƒ½
</string>
<string name="can_change">
- çµ±åˆï¼å†åˆ†å‰²å¯èƒ½
+ çµ±åˆãƒ»å†åˆ†å‰²å¯èƒ½
</string>
<string name="can_not_change">
- çµ±åˆï¼å†åˆ†å‰²ä¸å¯èƒ½
+ çµ±åˆãƒ»å†åˆ†å‰²ä¸å¯èƒ½
</string>
<string name="cant_buy_for_group">
ã‚ãªãŸã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—用ã®åœŸåœ°è³¼å…¥ã‚’許å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“
@@ -127,7 +127,7 @@
</string>
<string name="multiple_parcels_selected">
複数ã®ç•°ãªã£ãŸåŒºç”»ã‚’é¸æŠžã—ã¾ã—ãŸã€‚
-ã“れよりå°ã•ãªã‚¨ãƒªã‚¢ã‚’é¸æŠžã—ã¦ãã ã•ã„。
+ã“れよりå°ã•ãªç¯„囲をé¸æŠžã—ã¦ãã ã•ã„。
</string>
<string name="no_permission">
ã‚ãªãŸã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—用ã®åœŸåœ°è³¼å…¥ã‚’許å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“
@@ -149,7 +149,7 @@
</string>
<string name="not_owned_by_you">
ä»–ã®ä½¿ç”¨è€…ã«æ‰€æœ‰ã•ã‚ŒãŸåœŸåœ°ãŒé¸æŠžã•ã‚Œã¦ã„ã¾ã™ã€‚
-ã“れよりå°ã•ãªã‚¨ãƒªã‚¢ã‚’é¸æŠžã—ã¦ãã ã•ã„。
+ã“れよりå°ã•ãªç¯„囲をé¸æŠžã—ã¦ãã ã•ã„。
</string>
<string name="processing">
購入処ç†ä¸­...
@@ -203,7 +203,7 @@
オブジェクト [AMOUNT2] 個サãƒãƒ¼ãƒˆ
</string>
<string name="sold_with_objects">
- オブジェクトã¨å…±ã«è²©å£²æ¸ˆã¿
+ オブジェクト込ã¿ã§è²©å£²
</string>
<string name="sold_without_objects">
オブジェクトã¯å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_object.xml b/indra/newview/skins/default/xui/ja/floater_buy_object.xml
index f807e91573..7a5b7dc140 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_object.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="contents" title="オブジェクトã®ã‚³ãƒ”ーを購入">
<text name="contents_text">
- 内容:
+ 中身:
</text>
<text name="buy_text">
[NAME]ã‹ã‚‰L$[AMOUNT]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
@@ -12,15 +12,15 @@
購入
</text>
<string name="title_buy_copy_text">
- 次ã®ã‚‚ã®ã‚’è²·ã†
+ 次ã®ã‚‚ã®ã‚’購入
</string>
<text name="no_copy_text">
- (コピーãªã—)
+ (コピーä¸å¯)
</text>
<text name="no_modify_text">
- (修正ãªã—)
+ (修正ä¸å¯)
</text>
<text name="no_transfer_text">
- (転é€ãªã—)
+ (å†è²©ãƒ»ãƒ—レゼントä¸å¯)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_camera.xml b/indra/newview/skins/default/xui/ja/floater_camera.xml
index be118273fa..3730bcd385 100644
--- a/indra/newview/skins/default/xui/ja/floater_camera.xml
+++ b/indra/newview/skins/default/xui/ja/floater_camera.xml
@@ -11,7 +11,7 @@
</floater.string>
<panel name="controls">
<joystick_track name="cam_track_stick" tool_tip="カメラを上下左å³ã«å‹•ã‹ã—ã¾ã™"/>
- <panel name="zoom" tool_tip="å‘ã„ã¦ã‚‹æ–¹æ³•ã«ã‚«ãƒ¡ãƒ©ã‚’ズーム">
+ <panel name="zoom" tool_tip="å‘ã„ã¦ã„る方法ã«ã‚«ãƒ¡ãƒ©ã‚’ズーム">
<slider_bar name="zoom_slider" tool_tip="å‘ã„ã¦ã„ã‚‹æ–¹å‘ã«ã‚«ãƒ¡ãƒ©ã‚’ズーム"/>
</panel>
<joystick_rotate name="cam_rotate_stick" tool_tip="自分を軸ã«ã‚«ãƒ¡ãƒ©ã‚’回ã™"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_color_picker.xml b/indra/newview/skins/default/xui/ja/floater_color_picker.xml
index a98da4b8ba..dc87d27a15 100644
--- a/indra/newview/skins/default/xui/ja/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/ja/floater_color_picker.xml
@@ -18,7 +18,7 @@
<text name="l_val_text">
è¼åº¦ï¼š
</text>
- <check_box label="今ã™ãé©ç”¨" name="apply_immediate"/>
+ <check_box label="ã™ãé©ç”¨" name="apply_immediate"/>
<button label="" label_selected="" name="color_pipette"/>
<button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn"/>
<button label="OK" label_selected="OK" name="select_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_critical.xml b/indra/newview/skins/default/xui/ja/floater_critical.xml
index 39f6ee8e3f..f69c24622a 100644
--- a/indra/newview/skins/default/xui/ja/floater_critical.xml
+++ b/indra/newview/skins/default/xui/ja/floater_critical.xml
@@ -3,10 +3,10 @@
<button label="続行" label_selected="続行" name="Continue" />
<button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel" />
<text name="tos_title">
- クリティカル・メッセージ
+ クリティカルメッセージ
</text>
<text name="tos_heading">
- 次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’注æ„æ·±ããŠèª­ã¿ãã ã•ã„。
+ 次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’注æ„ã—ã¦ã‚ˆããŠèª­ã¿ãã ã•ã„。
</text>
<text_editor name="tos_text">
TOS_TEXT
diff --git a/indra/newview/skins/default/xui/ja/floater_customize.xml b/indra/newview/skins/default/xui/ja/floater_customize.xml
index 7d1809f1ed..27ce1adede 100644
--- a/indra/newview/skins/default/xui/ja/floater_customize.xml
+++ b/indra/newview/skins/default/xui/ja/floater_customize.xml
@@ -50,7 +50,7 @@
<panel label="スキン" name="Skin">
<button label="スキンã®è‰²" label_selected="スキンã®è‰²" name="Skin Color"/>
<button label="é¡”ã®ç´°éƒ¨" label_selected="é¡”ã®ç´°éƒ¨" name="Face Detail"/>
- <button label="メイクアップ" label_selected="メイクアップ" name="Makeup"/>
+ <button label="メイク" label_selected="メイク" name="Makeup"/>
<button label="身体細部" label_selected="身体細部" name="Body Detail"/>
<text name="title">
[DESC]
@@ -186,10 +186,10 @@
シャツ:
</text>
</panel>
- <panel label="ズボン" name="Pants">
+ <panel label="パンツ" name="Pants">
<texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
<color_swatch label="色ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="æ–°ã—ã„ズボンを作æˆ" label_selected="æ–°ã—ã„ズボンを作æˆ" name="Create New"/>
+ <button label="æ–°ã—ã„パンツを作æˆ" label_selected="æ–°ã—ã„パンツを作æˆ" name="Create New"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
@@ -216,7 +216,7 @@
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
</text>
<text name="Item Action Label">
- ズボン:
+ パンツ:
</text>
</panel>
<panel label="é´" name="Shoes">
diff --git a/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml
index 2d8b54cdd5..3bd5ed2837 100644
--- a/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml
@@ -84,10 +84,10 @@
<text name="DayCycleText3">
プレビュー:
</text>
- <button label="å†ç”Ÿ" label_selected="å†ç”Ÿ" name="WLAnimSky" />
+ <button label="å†ç”Ÿ" label_selected="å†ç”Ÿ" name="WLAnimSky" left_delta="70"/>
<button label="åœæ­¢!" label_selected="åœæ­¢" name="WLStopAnimSky" />
<button label="ä¸å‹•ç”£ã®æ™‚刻を使用"
- label_selected="ä¸å‹•ç”£ã®æ™‚刻ã«å¤‰æ›´" name="WLUseLindenTime" />
+ label_selected="ä¸å‹•ç”£ã®æ™‚刻ã«å¤‰æ›´" name="WLUseLindenTime" width="140"/>
<button label="デイ・テストをä¿å­˜"
label_selected="デイ・テストをä¿å­˜" name="WLSaveDayCycle" />
<button label="デイ・テストをロード"
diff --git a/indra/newview/skins/default/xui/ja/floater_god_tools.xml b/indra/newview/skins/default/xui/ja/floater_god_tools.xml
index 18380bddc2..075cde8dec 100644
--- a/indra/newview/skins/default/xui/ja/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_god_tools.xml
@@ -2,7 +2,7 @@
<floater name="godtools floater" title="ゴッド・ツール">
<tab_container name="GodTools Tabs">
<panel label="グリッド" name="grid">
- <button label="ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã™" label_selected="ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã™" name="Kick all users"/>
+ <button label="ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã™" label_selected="ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã™" name="Kick all users" width="160"/>
<button label="ã“ã®åœ°åŸŸã®åœ°å›³ã®è¡¨ç¤ºã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’消去" label_selected="ã“ã®åœ°åŸŸã®åœ°å›³ã®è¡¨ç¤ºã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’消去" name="Flush This Region&apos;s Map Visibility Caches"/>
</panel>
<panel label="地域" name="region">
@@ -33,13 +33,15 @@
<line_editor name="gridposx" tool_tip="ã“ã‚Œã¯ã€ã“ã®åœ°åŸŸã®ã‚°ãƒªãƒƒãƒ‰xã®ä½ç½®ã§ã™ã€‚"/>
<line_editor name="gridposy" tool_tip="ã“ã‚Œã¯ã€ã“ã®åœ°åŸŸã®ã‚°ãƒªãƒƒãƒ‰yã®ä½ç½®ã§ã™ã€‚"/>
<text name="Redirect to Grid: ">
- グリッドã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆï¼š
+ グリッドã«ãƒªãƒ€
+イレクト:
</text>
<text name="billable factor text">
請求率:
</text>
<text name="land cost text">
- 平方メートル当ãŸã‚ŠL$:
+ 平方メートル当
+ãŸã‚ŠL$:
</text>
<button label="æ›´æ–°" label_selected="æ›´æ–°" name="Refresh" tool_tip="上記ã®æƒ…報を更新ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚"/>
<button label="é©ç”¨" label_selected="é©ç”¨" name="Apply" tool_tip="上記ã®å¤‰æ›´ã‚’é©ç”¨ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_image_preview.xml b/indra/newview/skins/default/xui/ja/floater_image_preview.xml
index 57ed139e54..2e57acf0d2 100644
--- a/indra/newview/skins/default/xui/ja/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_image_preview.xml
@@ -7,7 +7,7 @@
説明:
</text>
<text name="preview_label">
- イメージã®ï¾Œï¾Ÿï¾šï¾‹ï¾žï½­ï½°ï¼š
+ プレビュー:
</text>
<combo_box label="æœã®ç¨®é¡ž" name="clothing_type_combo">
<combo_box.item label="ç”»åƒ" name="Image"/>
@@ -26,7 +26,7 @@
24bitTarga(.tga)ã§ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’ä¿å­˜ã—ã¦ãã ã•ã„。
</text>
- <check_box label="ロスã®ãªã„圧縮を使用" name="lossless_check"/>
+ <check_box label="å¯é€†åœ§ç¸®" name="lossless_check"/>
<button label="å–り消ã—" name="cancel_btn"/>
- <button label="アップロードL$[AMOUNT]" name="ok_btn"/>
+ <button label="アップロード゙L$[AMOUNT]" name="ok_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_inspect.xml b/indra/newview/skins/default/xui/ja/floater_inspect.xml
index b7c657c2f9..b3825c0b7f 100644
--- a/indra/newview/skins/default/xui/ja/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inspect.xml
@@ -3,12 +3,12 @@
<floater.string name="timeStamp">
[year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
</floater.string>
- <scroll_list name="object_list" tool_tip="ã“ã®ãƒªã‚¹ãƒˆã‹ã‚‰ã‚ªãƒ–ジェクトをé¸æŠžã—ã€ã“ã®ä¸–ç•Œã§å¼·èª¿è¡¨ç¤ºã—ã¾ã™ã€‚">
- <scroll_list.columns label="オブジェクトå" name="object_name"/>
+ <scroll_list name="object_list" tool_tip="リストã‹ã‚‰ã‚ªãƒ–ジェクトをé¸æŠžã—ã€ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã§å¼·èª¿è¡¨ç¤ºã—ã¾ã™ã€‚">
+ <scroll_list.columns label="åå‰" name="object_name"/>
<scroll_list.columns label="所有者å" name="owner_name"/>
<scroll_list.columns label="制作者å" name="creator_name"/>
<scroll_list.columns label="作æˆæ—¥" name="creation_date"/>
</scroll_list>
- <button label="所有者ã®ãƒ—ロフィールを表示..." name="button owner" tool_tip="é¸æŠžã•ã‚ŒãŸã‚ªãƒ–ジェクトã®æ‰€æœ‰è€…ã®ãƒ—ロフィールを見る"/>
- <button label="制作者ã®ãƒ—ロフィールを表示..." name="button creator" tool_tip="é¸æŠžã•ã‚ŒãŸã‚ªãƒ–ジェクトã®åˆ¶ä½œè€…ã®ãƒ—ロフィールを見る"/>
+ <button label="所有者ã®ãƒ—ロフィールを表示..." name="button owner" tool_tip="é¸æŠžã—ãŸã‚ªãƒ–ジェクトã®æ‰€æœ‰è€…ã®ãƒ—ロフィールを表示ã—ã¾ã™" width="180"/>
+ <button label="制作者ã®ãƒ—ロフィールを表示..." name="button creator" tool_tip="é¸æŠžã—ãŸã‚ªãƒ–ジェクトã®åˆ¶ä½œè€…ã®ãƒ—ロフィールを表示ã—ã¾ã™" width="180"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_inventory.xml b/indra/newview/skins/default/xui/ja/floater_inventory.xml
index 7cf16b8ff2..b113fde94a 100644
--- a/indra/newview/skins/default/xui/ja/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inventory.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Inventory" title="æŒã¡ç‰©">
<floater.string name="Title">
- インベントリ
+ æŒã¡ç‰©
</floater.string>
<floater.string name="TitleFetching">
æŒã¡ç‰© ( [ITEM_COUNT] アイテムをå–得中...) [FILTER]
diff --git a/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
index 86bb5dcf62..47a63e5e20 100644
--- a/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
@@ -9,7 +9,7 @@
<check_box label="オブジェクト" name="check_object"/>
<check_box label="スクリプト" name="check_script"/>
<check_box label="サウンド" name="check_sound"/>
- <check_box label="テクスãƒãƒ£ãƒ¼" name="check_texture"/>
+ <check_box label="テクスãƒãƒ£" name="check_texture"/>
<check_box label="スナップショット" name="check_snapshot"/>
<button label="ã™ã¹ã¦" label_selected="ã™ã¹ã¦" name="All"/>
<button label="ãªã—" label_selected="ãªã—" name="None"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_joystick.xml b/indra/newview/skins/default/xui/ja/floater_joystick.xml
index 9d91fe8db9..65eeebe4ed 100644
--- a/indra/newview/skins/default/xui/ja/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/ja/floater_joystick.xml
@@ -71,7 +71,7 @@
<spinner left="135" name="AvatarAxisDeadZone0" width="50"/>
<spinner left="205" name="BuildAxisDeadZone0" width="50"/>
<spinner left="275" name="FlycamAxisDeadZone0" width="50"/>
- <text left="0" name="PitchDeadZone" width="135">
+ <text left="0" name="PitchDeadZone" width="125">
ピッãƒãƒ»ãƒ‡ãƒƒãƒ‰ãƒ»ã‚¾ãƒ¼ãƒ³
</text>
<spinner left="135" name="AvatarAxisDeadZone4" width="50"/>
@@ -83,7 +83,7 @@
<spinner left="135" name="AvatarAxisDeadZone5" width="50"/>
<spinner left="205" name="BuildAxisDeadZone5" width="50"/>
<spinner left="275" name="FlycamAxisDeadZone5" width="50"/>
- <text left="0" name="RollDeadZone" width="135">
+ <text left="0" name="RollDeadZone" width="125">
ロール・デッド・ゾーン
</text>
<spinner left="205" name="BuildAxisDeadZone3" width="50"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml
index 474bd32cb0..aca916f22f 100644
--- a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml
@@ -7,17 +7,17 @@
<column label="é¢ç©" name="area"/>
<column label="" name="hidden"/>
</scroll_list>
- <button label="テレãƒãƒ¼ãƒˆ" label_selected="テレãƒãƒ¼ãƒˆ" name="Teleport" tool_tip="ã“ã®åœŸåœ°ã®ä¸­å¿ƒã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/>
+ <button label="テレãƒãƒ¼ãƒˆ" label_selected="テレãƒãƒ¼ãƒˆ" name="Teleport" tool_tip="ã“ã®åœŸåœ°ã®ä¸­å¿ƒã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/>
<button label="地図" label_selected="地図" name="Show on Map" tool_tip="ã“ã®åœŸåœ°ã‚’世界地図ã«è¡¨ç¤ºã—ã¾ã™"/>
<text name="contrib_label">
- ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã¸ã®è²¢çŒ®ï¼š
+ 所属グループã¸ã®è²¢çŒ®ï¼š
</text>
<scroll_list name="grant list">
<column label="グループå" name="group"/>
<column label="é¢ç©" name="area"/>
</scroll_list>
<text name="allowed_label">
- ç¾åœ¨ã®æ”¯æ‰•ã„プランã§ã®è¨±å¯ã•ã‚ŒãŸä¿æœ‰åœ°ï¼š
+ ç¾åœ¨ã®æ”¯æ‰•ã„プランã§è¨±å¯ã•ã‚ŒãŸä¿æœ‰åœ°ï¼š
</text>
<text name="allowed_text">
[AREA] 平方メートル
@@ -29,7 +29,7 @@
[AREA] 平方メートル
</text>
<text name="available_label">
- 土地購入å¯ï¼š
+ 購入å¯èƒ½ãªåœŸåœ°ï¼š
</text>
<text name="available_text">
[AREA] 平方メートル
diff --git a/indra/newview/skins/default/xui/ja/floater_map.xml b/indra/newview/skins/default/xui/ja/floater_map.xml
index f3cba7e674..78af3cec07 100644
--- a/indra/newview/skins/default/xui/ja/floater_map.xml
+++ b/indra/newview/skins/default/xui/ja/floater_map.xml
@@ -25,7 +25,7 @@
北西
</floater.string>
<floater.string name="ToolTipMsg">
- [AGENT][REGION] (ダブルクリックã§åœ°å›³ã‚’é–‹ã)
+ [AGENT][REGION] (ダブルクリックã§åœ°å›³ã‚’é–‹ãã¾ã™ï¼‰
</floater.string>
<text label="北" name="floater_map_north" text="北">
北
diff --git a/indra/newview/skins/default/xui/ja/floater_media_browser.xml b/indra/newview/skins/default/xui/ja/floater_media_browser.xml
index 4f67523eec..c4731b73a3 100644
--- a/indra/newview/skins/default/xui/ja/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/ja/floater_media_browser.xml
@@ -22,8 +22,8 @@
<button label="ç¾åœ¨ã®ãƒšãƒ¼ã‚¸ã‚’区画ã«é€ã‚‹" name="assign"/>
</layout_panel>
<layout_panel name="external_controls">
- <button label="外部ウェブ・ブラウザã§é–‹ã" name="open_browser"/>
- <check_box label="常ã«å¤–部ã®ã‚¦ã‚§ãƒ–・ブラウザã§é–‹ã" name="open_always"/>
+ <button label="外部Webブラウザã§é–‹ã" name="open_browser"/>
+ <check_box label="常ã«å¤–部ã®Webブラウザã§é–‹ã" name="open_always"/>
<button label="é–‰ã˜ã‚‹" name="close"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml b/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml
index 6167b6db91..f48bb94e32 100644
--- a/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="MemLeak" title="メモリリークã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ãƒˆ">
- <spinner label="リークスピード(1フレームã”ã¨ã®ãƒã‚¤ãƒˆæ•°):" label_width="244" name="leak_speed"/>
- <spinner label="リークã—ãŸæœ€å¤§ãƒ¡ãƒ¢ãƒªæ•°(MB):" label_width="244" name="max_leak"/>
+ <spinner label="リーク速度(1フレームã”ã¨ã®ãƒã‚¤ãƒˆæ•°):" label_width="244" name="leak_speed"/>
+ <spinner label="最大メモリリーク(MB):" label_width="244" name="max_leak"/>
<text name="total_leaked_label">
- ç¾åœ¨ã®ãƒªãƒ¼ã‚¯ãƒ¡ãƒ¢ãƒªã‚µã‚¤ã‚ºï¼š [SIZE] KB
+ ç¾åœ¨ã®ãƒ¡ãƒ¢ãƒªãƒªãƒ¼ã‚¯ï¼š [SIZE] KB
</text>
<text name="note_label_1">
[NOTE1]
diff --git a/indra/newview/skins/default/xui/ja/floater_perm_prefs.xml b/indra/newview/skins/default/xui/ja/floater_perm_prefs.xml
index adbb8596d3..98cda25a81 100644
--- a/indra/newview/skins/default/xui/ja/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/ja/floater_perm_prefs.xml
@@ -5,11 +5,11 @@
<check_box label="グループã§å…±åŒç®¡ç†" name="share_with_group"/>
<check_box label="誰ã«å¯¾ã—ã¦ã‚‚コピーを許å¯" name="everyone_copy"/>
<text name="NextOwnerLabel">
- 次ã®ã‚ªãƒ¼ãƒŠãƒ¼ãŒã§ãã‚‹æ“作:
+ 次ã®æ‰€æœ‰è€…ãŒã§ãã‚‹æ“作:
</text>
<check_box label="修正" name="next_owner_modify"/>
<check_box label="コピー" name="next_owner_copy"/>
- <check_box label="å†è²©/プレゼント" name="next_owner_transfer"/>
+ <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="next_owner_transfer"/>
</panel>
<button label="OK" label_selected="OK" name="ok"/>
<button label="å–り消ã—" label_selected="å–り消ã—" name="cancel"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_postcard.xml b/indra/newview/skins/default/xui/ja/floater_postcard.xml
index b2ca059ccd..5a2b047fe0 100644
--- a/indra/newview/skins/default/xui/ja/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/ja/floater_postcard.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Postcard" title="スナップショットをメール">
<text name="to_label">
- ä½äººã®Eメール:
+ ä½äººã®ãƒ¡ãƒ¼ãƒ«ï¼š
</text>
<line_editor left="145" name="to_form" width="125"/>
<text name="from_label">
- ã‚ãªãŸã®Eメール:
+ ã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ«ï¼š
</text>
<line_editor left="145" name="from_form" width="125"/>
<text name="name_label">
@@ -15,14 +15,14 @@
<text name="subject_label">
件å:
</text>
- <line_editor label="件åã‚’ã“ã“ã«å…¥åŠ›" left="145" name="subject_form" width="125"/>
+ <line_editor label="件åを入力ã—ã¦ãã ã•ã„" left="145" name="subject_form" width="125"/>
<text name="msg_label">
メッセージ:
</text>
<text_editor bottom_delta="-120" height="110" name="msg_form">
メッセージをã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„。
</text_editor>
- <check_box label="ウェブ上ã§å…¬é–‹" name="allow_publish_check" tool_tip="ã“ã®ãƒã‚¹ãƒˆã‚«ãƒ¼ãƒ‰ã‚’ウェブ上ã§å…¬é–‹ã—ã¾ã™ã€‚"/>
+ <check_box label="Web上ã§å…¬é–‹" name="allow_publish_check" tool_tip="ã“ã®ãƒã‚¹ãƒˆã‚«ãƒ¼ãƒ‰ã‚’Web上ã§å…¬é–‹ã—ã¾ã™ã€‚"/>
<check_box label="æˆäººå‘ã‘コンテンツ" name="mature_check" tool_tip="ã“ã®ãƒã‚¹ãƒˆã‚«ãƒ¼ãƒ‰ã«ã¯æˆäººå‘ã‘内容ãŒå«ã¾ã‚Œã¾ã™ã€‚"/>
<button label="?" left="300" name="publish_help_btn"/>
<text name="fine_print">
diff --git a/indra/newview/skins/default/xui/ja/floater_preferences.xml b/indra/newview/skins/default/xui/ja/floater_preferences.xml
index 1493219b83..e2893d5eab 100644
--- a/indra/newview/skins/default/xui/ja/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preferences.xml
@@ -8,7 +8,7 @@
<panel label="プライãƒã‚·ãƒ¼" name="im"/>
<panel label="サウンド" name="audio"/>
<panel label="ãƒãƒ£ãƒƒãƒˆ" name="chat"/>
- <panel label="通知" name="msgs"/>
+ <panel label="メッセージ" name="msgs"/>
<panel label="セットアップ" name="input"/>
<panel label="詳細" name="advanced1"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_animation.xml b/indra/newview/skins/default/xui/ja/floater_preview_animation.xml
index fb2f2c7433..2c0d6a0097 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
説明:
</text>
- <button label="世界ã§å†ç”Ÿ" label_selected="åœæ­¢" name="Anim play btn" tool_tip="他人ã«è¦‹ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿ"/>
- <button label="ローカルã«å†ç”Ÿ" label_selected="åœæ­¢" name="Anim audition btn" tool_tip="自分ã ã‘ãŒè¦‹ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿ"/>
+ <button label="ワールドå†ç”Ÿ" label_selected="åœæ­¢" name="Anim play btn" tool_tip="他人ã«ã‚‚見ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿã—ã¾ã™"/>
+ <button label="ローカルå†ç”Ÿ" label_selected="åœæ­¢" name="Anim audition btn" tool_tip="自分ã ã‘ãŒè¦‹ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿã—ã¾ã™"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml
index a378700d15..8a0aea717c 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml
@@ -38,7 +38,7 @@
</text>
<line_editor name="replace_editor" tool_tip="トリガー・ワードをã“れらã®å˜èªžã«ç½®ãæ›ãˆã¾ã™ã€‚ ãŸã¨ãˆã°ã€ãƒˆãƒªã‚¬ãƒ¼ã€Œhelloã€ã‚’「Howdyã€ã«ç½®æ›ã™ã‚‹ã¨ã€ã€ŒI wanted to say helloã€ã¨ã„ã†ãƒãƒ£ãƒƒãƒˆæ–‡ãŒã€ŒI wanted to say howdyã€ã«å¤‰ã‚ã‚Šã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã«ã‚‚ç½®æ›ãŒå映ã•ã‚Œã¾ã™ã€‚"/>
<text name="key_label">
- ショートカット・キー:
+ ショートカット:
</text>
<combo_box label="ãªã—" left="160" name="modifier_combo"/>
<combo_box label="ãªã—" name="key_combo"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml
index 596699d6c1..e96a43d0c1 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml
@@ -6,8 +6,8 @@
<text name="key_label">
キーボード:
</text>
- <combo_box label="ãªã—" name="modifier_combo"/>
- <combo_box label="ãªã—" name="key_combo"/>
+ <combo_box label="ãªã—" name="modifier_combo" width="60"/>
+ <combo_box label="ãªã—" name="key_combo" width="60"/>
<text name="replace_text" tool_tip="ã“れらã®å˜èªžã«ãƒˆãƒªã‚¬ãƒ¼ã¨ãªã‚‹å˜èªžã‚’ç½®ãæ›ãˆã¾ã™ã€‚ 例ãˆã°ã€ã€Œhowdyã€ã¨ã€Œhelloã€ã‚’ç½®ãæ›ãˆã‚‹ã¨ã€ã€ŒI wanted to say helloã€ã¨ã„ã†ãƒãƒ£ãƒƒãƒˆã¯ã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã‚’交ãˆãªãŒã‚‰ã®ã€ŒI wanted to say howdyã€ã«å¤‰ã‚ã‚Šã¾ã™ã€‚">
ç½®ãæ›ãˆï¼š
</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_sound.xml b/indra/newview/skins/default/xui/ja/floater_preview_sound.xml
index d3c06cbef4..dc334dfc1f 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_sound.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
説明:
</text>
- <button label="世界ã§å†ç”Ÿ" label_selected="世界ã§å†ç”Ÿ" name="Sound play btn" tool_tip="他人ãŒèžã“ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿ"/>
- <button label="ローカルã«å†ç”Ÿ" label_selected="ローカルã«å†ç”Ÿ" name="Sound audition btn" tool_tip="自分ã ã‘ãŒèžã“ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿ"/>
+ <button label="ワールドå†ç”Ÿ" label_selected="ワールドå†ç”Ÿ" name="Sound play btn" tool_tip="他人ã«ã‚‚èžã“ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿã—ã¾ã™"/>
+ <button label="ローカルå†ç”Ÿ" label_selected="ローカルå†ç”Ÿ" name="Sound audition btn" tool_tip="自分ã ã‘ãŒèžã“ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿã—ã¾ã™"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_report_abuse.xml b/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
index ca6faf59c2..c66f307f23 100644
--- a/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
@@ -25,7 +25,7 @@
<text name="select_object_label">
ボタンをクリックã—ã¦ã‹ã‚‰ã€æ‚ªæ„ã®ã‚るオブジェクトをクリック:
</text>
- <button label="" label_selected="" name="pick_btn" tool_tip="オブジェクト・ピッカー - ã“ã®å ±å‘Šã®ä¸»é¡Œã¨ãªã‚‹ã‚ªãƒ–ジェクトを特定"/>
+ <button label="" label_selected="" name="pick_btn" tool_tip="オブジェクトピッカー - 報告対象ã®ã‚ªãƒ–ジェクトをé¸æŠžã—ã¦ãã ã•ã„"/>
<text name="object_name_label">
オブジェクト:
</text>
@@ -33,13 +33,13 @@
Consetetur Sadipscing
</text>
<text name="owner_name_label">
- オーナー:
+ 所有者:
</text>
<text name="owner_name">
Hendrerit Vulputate Kamawashi Longname
</text>
- <combo_box name="category_combo" tool_tip="カテゴリー -- ã“ã®å ±å‘Šã«æœ€ã‚‚é©ã—ãŸã‚«ãƒ†ã‚´ãƒªãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„">
- <combo_box.item label="カテゴリーをé¸æŠž" name="Select_category"/>
+ <combo_box name="category_combo" tool_tip="カテゴリ -- ã“ã®å ±å‘Šã«æœ€ã‚‚é©ã—ãŸã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„">
+ <combo_box.item label="カテゴリをé¸æŠžã—ã¦ãã ã•ã„" name="Select_category"/>
<combo_box.item label="年齢>年齢å½è¨¼" name="Age__Age_play"/>
<combo_box.item label="å¹´é½¢ &gt; æˆäººã®ä½äººãŒ Teen Second Life ã«ã„ã‚‹" name="Age__Adult_resident_on_Teen_Second_Life"/>
<combo_box.item label="å¹´é½¢ &gt; 未æˆå¹´ã®ä½äººãŒTeen Second Life ã®å¤–ã«ã„ã‚‹" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
@@ -92,7 +92,7 @@
<text name="dscr_title">
詳細:
</text>
- <text name="bug_aviso">
+ <text name="bug_aviso" width="210">
ã§ãã‚‹ã ã‘具体的ã«è©³ã—ã記入ã—ã¦ãã ã•ã„。
</text>
<text name="incomplete_title">
diff --git a/indra/newview/skins/default/xui/ja/floater_sell_land.xml b/indra/newview/skins/default/xui/ja/floater_sell_land.xml
index b06b16bbb3..1e884af5f2 100644
--- a/indra/newview/skins/default/xui/ja/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_sell_land.xml
@@ -36,7 +36,7 @@
2. 特定ã®äººã«è²©å£²ï¼š
</text>
<text name="sell_to_text" right="-6">
- 販売先ã®æŒ‡å®šãªã—ã‹ã€ç‰¹å®šã®äººã«è²©å£²ã™ã‚‹ã‹é¸æŠžã—ã¦ãã ã•ã„。
+ 販売先ã®æŒ‡å®šãªã—ã‹ã€ç‰¹å®šã®äººã«è²©å£²ã™ã‚‹ã‹ã‚’é¸æŠžã—ã¦ãã ã•ã„。
</text>
<combo_box name="sell_to">
<combo_box.item label="- 1ã¤é¸æŠž -" name="--selectone--"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_snapshot.xml b/indra/newview/skins/default/xui/ja/floater_snapshot.xml
index 6c84de9b19..4ad54ec7ab 100644
--- a/indra/newview/skins/default/xui/ja/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/ja/floater_snapshot.xml
@@ -28,21 +28,21 @@
å½¢å¼
</text>
<combo_box label="解åƒåº¦" name="postcard_size_combo">
- <combo_box.item label="ç¾åœ¨ã®ï½³ï½¨ï¾ï¾„゙ウ" name="CurrentWindow"/>
+ <combo_box.item label="ç¾åœ¨ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="CurrentWindow"/>
<combo_box.item label="640x480" name="640x480"/>
<combo_box.item label="800x600" name="800x600"/>
<combo_box.item label="1024x768" name="1024x768"/>
<combo_box.item label="カスタム" name="Custom"/>
</combo_box>
<combo_box label="解åƒåº¦" name="texture_size_combo">
- <combo_box.item label="ç¾åœ¨ã®ï½³ï½¨ï¾ï¾„゙ウ" name="CurrentWindow"/>
+ <combo_box.item label="ç¾åœ¨ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="CurrentWindow"/>
<combo_box.item label="å°ï¼ˆ128x128)" name="Small(128x128)"/>
<combo_box.item label="中(256x256)" name="Medium(256x256)"/>
<combo_box.item label="大(512x512)" name="Large(512x512)"/>
<combo_box.item label="カスタム" name="Custom"/>
</combo_box>
<combo_box label="解åƒåº¦" name="local_size_combo">
- <combo_box.item label="ç¾åœ¨ã®ï½³ï½¨ï¾ï¾„゙ウ" name="CurrentWindow"/>
+ <combo_box.item label="ç¾åœ¨ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="CurrentWindow"/>
<combo_box.item label="320x240" name="320x240"/>
<combo_box.item label="640x480" name="640x480"/>
<combo_box.item label="800x600" name="800x600"/>
@@ -61,7 +61,7 @@
<check_box label="縦横比ã®å›ºå®š" name="keep_aspect_check"/>
<slider label="画質" name="image_quality_slider"/>
<text name="layer_type_label">
- キャプï¾ï½¬ï¼š
+ キャプãƒãƒ£ï¼š
</text>
<combo_box label="ç”»åƒãƒ¬ã‚¤ãƒ¤ãƒ¼" name="layer_types">
<combo_box.item label="色" name="Colors"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_sound_preview.xml b/indra/newview/skins/default/xui/ja/floater_sound_preview.xml
index a24ba6e075..7d83309c46 100644
--- a/indra/newview/skins/default/xui/ja/floater_sound_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_sound_preview.xml
@@ -9,7 +9,7 @@
<button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn"/>
<button label="アップロード (L$[AMOUNT])" label_selected="アップロード (L$[AMOUNT])" name="ok_btn"/>
<text name="text">
- ビットレート(kbps):
+ ビットレート(kbps):
</text>
<radio_group name="bitrate">
<radio_item label="32" name="32"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_telehub.xml b/indra/newview/skins/default/xui/ja/floater_telehub.xml
index bdb92c8e30..7318083771 100644
--- a/indra/newview/skins/default/xui/ja/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/ja/floater_telehub.xml
@@ -10,7 +10,7 @@
「切断ã€ã‚’クリックã—ã¦å‰Šé™¤ã—ã¾ã™ã€‚
</text>
<text name="help_text_not_connected">
- 物体をé¸æŠžã—「テレãƒãƒ–ã®æŽ¥ç¶šã€ã‚’クリックã™ã‚‹
+ 物体をé¸æŠžã—ã¦ã€Œãƒ†ãƒ¬ãƒãƒ–ã®æŽ¥ç¶šã€ã‚’クリックã—ã¦ãã ã•ã„。
</text>
<button label="テレãƒãƒ–ã®æŽ¥ç¶š" name="connect_btn"/>
<button label="切断" name="disconnect_btn"/>
@@ -20,9 +20,6 @@
<button label="出ç¾ä½ç½®ã‚’追加" name="add_spawn_point_btn"/>
<button label="出ç¾åœ°ç‚¹ã‚’削除" name="remove_spawn_point_btn"/>
<text name="spawn_point_help">
- オブジェクトをé¸ã³ã€ã€Œå‡ºç¾åœ°ç‚¹ã‚’追加ã€ã‚’クリックã—ã¦ä½ç½®ã‚’指定ã—ã¾ã™ã€‚
-ãã†ã™ã‚‹ã¨ãã®ã‚ªãƒ–ジェクトを移動ã•ã›ãŸã‚Šå‰Šé™¤ã§ãã¾ã™ã€‚
-ä½ç½®ã¯ãƒ†ãƒ¬ãƒãƒ–センターã«é–¢é€£ã—ã¾ã™ã€‚
-リストã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¦ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã§ãƒã‚¤ãƒ©ã‚¤ãƒˆã•ã›ã¾ã™ã€‚
+ オブジェクトをé¸ã³ã€ã€Œå‡ºç¾åœ°ç‚¹ã‚’追加ã€ã‚’クリックã—ã¦ä½ç½®ã‚’指定ã—ã¾ã™ã€‚ãã†ã™ã‚‹ã¨ãã®ã‚ªãƒ–ジェクトを移動ã•ã›ãŸã‚Šå‰Šé™¤ã§ãã¾ã™ã€‚ä½ç½®ã¯ãƒ†ãƒ¬ãƒãƒ–センターã«é–¢é€£ã—ã¾ã™ã€‚リストã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¦ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã§ãƒã‚¤ãƒ©ã‚¤ãƒˆã•ã›ã¾ã™ã€‚
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
index 1500808e60..399cffcce5 100644
--- a/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="texture picker" title="é¸æŠžï¼š テクスãƒãƒ£">
+<floater name="texture picker" title="テクスãƒãƒ£ã®é¸æŠž">
<string name="choose_picture">
クリックã—ã¦å†™çœŸã‚’é¸æŠž
</string>
@@ -9,12 +9,12 @@
<text name="unknown">
サイズ: [DIMENSIONS]
</text>
- <button label="デフォルト" label_selected="デフォルト" name="Default"/>
+ <button label="デフォルト" label_selected="デフォルト" name="Default"/>
<button label="ãªã—" label_selected="ãªã—" name="None"/>
<button label="ブランク" label_selected="ブランク" name="Blank"/>
<check_box label="フォルダを表示" name="show_folders_check"/>
<search_editor label="テクスãƒãƒ£ã‚’フィルター" name="inventory search editor"/>
- <check_box label="今ã™ãé©ç”¨" name="apply_immediate_check"/>
+ <check_box label="ã™ãé©ç”¨" name="apply_immediate_check"/>
<button label="" label_selected="" name="Pipette"/>
<button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/>
<button label="OK" label_selected="OK" name="Select"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml
index 52d3537d9a..456e30c2b4 100644
--- a/indra/newview/skins/default/xui/ja/floater_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_tools.xml
@@ -171,7 +171,7 @@
Esbee Linden
</text>
<text name="Owner:">
- オーナー:
+ 所有者:
</text>
<text name="Owner Name">
Erica Linden
@@ -197,7 +197,7 @@
<check_box label="販売対象:" name="checkbox for sale"/>
<combo_box name="sale type">
<combo_box.item label="コピー" name="Copy"/>
- <combo_box.item label="コンテンツ" name="Contents"/>
+ <combo_box.item label="中身" name="Contents"/>
<combo_box.item label="オリジナル" name="Original"/>
</combo_box>
<spinner label="価格: L$" name="Edit Cost"/>
@@ -239,9 +239,9 @@
</panel>
<panel label="形状" name="Object">
<check_box label="ロック済ã¿" name="checkbox locked" tool_tip="オブジェクトã®ç§»å‹•ã¨å‰Šé™¤ã‚’ç¦æ­¢ã—ã¾ã™ã€‚ ã“ã®æ©Ÿèƒ½ã‚’使ã†ã¨ã€æ§‹ç¯‰ä¸­ã«æ„図ã—ãªã„編集を防ãã“ã¨ãŒã§ãã¾ã™ã€‚"/>
- <check_box label="物ç†" name="Physical Checkbox Ctrl" tool_tip="オブジェクトã«å¯¾ã™ã‚‹é‡åŠ›ã®ä½œç”¨ã¨å½±éŸ¿ã‚’有効ã«ã™ã‚‹"/>
+ <check_box label="物ç†" name="Physical Checkbox Ctrl" tool_tip="オブジェクトã«å¯¾ã™ã‚‹é‡åŠ›ã®ä½œç”¨ã¨å½±éŸ¿ã‚’有効ã«ã—ã¾ã™"/>
<check_box label="臨時" name="Temporary Checkbox Ctrl" tool_tip="制作後 1 分ã§ã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•ã‚Œã¾ã™"/>
- <check_box label="ファントム" name="Phantom Checkbox Ctrl" tool_tip="オブジェクトåŒå£«ã®è¡çªã¾ãŸã¯ã‚ªãƒ–ジェクトã¨ã‚¢ãƒã‚¿ãƒ¼ã®è¡çªã‚’回é¿"/>
+ <check_box label="ファントム" name="Phantom Checkbox Ctrl" tool_tip="オブジェクトåŒå£«ã®è¡çªã¾ãŸã¯ã‚ªãƒ–ジェクトã¨ã‚¢ãƒã‚¿ãƒ¼ã®è¡çªã‚’回é¿ã—ã¾ã™"/>
<text name="label position">
ä½ç½®ï¼ˆãƒ¡ãƒ¼ãƒˆãƒ«ï¼‰
</text>
@@ -280,7 +280,7 @@
<combo_box.item label="ゴム" name="Rubber"/>
</combo_box>
<text name="text cut">
- パスカット (始点/終点)
+ パスカット (始点・終点)
</text>
<spinner label="B" name="cut begin"/>
<spinner label="E" name="cut end"/>
@@ -300,7 +300,7 @@
<combo_box.item label="三角形" name="Triangle"/>
</combo_box>
<text name="text twist">
- ã²ã­ã‚Š (始点/終点)
+ ã²ã­ã‚Š (始点・終点)
</text>
<spinner label="B" name="Twist Begin"/>
<spinner label="E" name="Twist End"/>
@@ -318,13 +318,13 @@
<spinner label="X" name="Shear X"/>
<spinner label="Y" name="Shear Y"/>
<text name="advanced_cut">
- プロフィールカット (始点/終点)
+ プロフィールカット (始点・終点)
</text>
<text name="advanced_dimple">
- ãã¼ã¿ (始点/終点)
+ ãã¼ã¿ (始点・終点)
</text>
<text name="advanced_slice">
- 切りå–ã‚Š (始点/終点)
+ 切りå–ã‚Š (始点・終点)
</text>
<spinner label="B" name="Path Limit Begin"/>
<spinner label="E" name="Path Limit End"/>
@@ -340,8 +340,8 @@
回転体
</text>
<texture_picker label="スカルプトテクスãƒãƒ£ãƒ¼" name="sculpt texture control" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¦ãã ã•ã„。"/>
- <check_box label="ミラー" name="sculpt mirror control" tool_tip="スカルプトプリムを X 軸上ã§å転ã•ã›ã‚‹"/>
- <check_box label="è£è¿”ã—" name="sculpt invert control" tool_tip="スカルプトプリムをå転ã•ã›ã¦è£è¿”ã™"/>
+ <check_box label="ミラー" name="sculpt mirror control" tool_tip="スカルプトプリムを X 軸上ã§å転ã•ã›ã¾ã™"/>
+ <check_box label="è£è¿”ã—" name="sculpt invert control" tool_tip="スカルプトプリムをå転ã•ã›ã¦è£è¿”ã—ã¾ã™"/>
<text name="label sculpt type">
縫ã„ç›®ã®ã‚¿ã‚¤ãƒ—
</text>
@@ -360,7 +360,7 @@
<text name="edit_object">
オブジェクトã®ç‰¹å¾´ã‚’編集:
</text>
- <check_box label="フレキシブル・パス" name="Flexible1D Checkbox Ctrl" tool_tip="Z 軸を中心ã«ã‚ªãƒ–ジェクトã®å±ˆæ›²ã‚’有効ã«ã™ã‚‹ï¼ˆã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã®ã¿ï¼‰"/>
+ <check_box label="フレキシブル・パス" name="Flexible1D Checkbox Ctrl" tool_tip="Z 軸を中心ã«ã‚ªãƒ–ジェクトã®å±ˆæ›²ã‚’有効ã«ã—ã¾ã™ï¼ˆã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã®ã¿ï¼‰"/>
<spinner label="柔軟性" label_width="72" name="FlexNumSections" width="135"/>
<spinner label="é‡åŠ›" label_width="72" name="FlexGravity" width="135"/>
<spinner label="ドラッグ" label_width="72" name="FlexFriction" width="135"/>
@@ -369,9 +369,9 @@
<spinner label="X軸方å‘ã®åŠ›" label_width="72" name="FlexForceX" width="135"/>
<spinner label="Y軸方å‘ã®åŠ›" label_width="72" name="FlexForceY" width="135"/>
<spinner label="Z軸方å‘ã®åŠ›" label_width="72" name="FlexForceZ" width="135"/>
- <check_box label="å…‰" name="Light Checkbox Ctrl" tool_tip="オブジェクトãŒç™ºå…‰"/>
+ <check_box label="å…‰" name="Light Checkbox Ctrl" tool_tip="オブジェクトãŒç™ºå…‰ã—ã¾ã™"/>
<color_swatch label="" left_delta="74" name="colorswatch" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <texture_picker label="" name="light texture control" tool_tip="クリックã§æŠ•å½±ç”»ã‚’é¸æŠžï¼ˆé…延レンダリング有効時ã®ã¿ï¼‰"/>
+ <texture_picker label="" name="light texture control" tool_tip="クリックã§æŠ•å½±ç”»ã‚’é¸æŠžã—ã¾ã™ï¼ˆé…延レンダリング有効時ã®ã¿ï¼‰"/>
<spinner label="è¼åº¦" label_width="72" name="Light Intensity" width="135"/>
<spinner label="FOV" name="Light FOV"/>
<spinner label="åŠå¾„" label_width="72" name="Light Radius" width="135"/>
@@ -381,7 +381,7 @@
</panel>
<panel label="æ質" name="Texture">
<panel.string name="string repeats per meter">
- メートルã”ã¨ã«ç¹°è¿”ã™
+ メートルã”ã¨ã«ç¹°ã‚Šè¿”ã™
</panel.string>
<panel.string name="string repeats per face">
é¢ã”ã¨ã«ç¹°ã‚Šè¿”ã™
@@ -453,10 +453,10 @@
<text name="media_tex">
メディア
</text>
- <button name="add_media" tool_tip="メディアを追加"/>
- <button name="delete_media" tool_tip="ã“ã®ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’削除"/>
- <button name="edit_media" tool_tip="ã“ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’編集"/>
- <button label="æƒãˆã‚‹" label_selected="メディアを一列ã«æƒãˆã‚‹" name="button align" tool_tip="メディアテクスãƒãƒ£ã‚’一列ã«æƒãˆã‚‹ï¼ˆæœ€åˆã«èª­ã¿è¾¼ã‚€å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼‰"/>
+ <button name="add_media" tool_tip="メディアを追加ã—ã¾ã™"/>
+ <button name="delete_media" tool_tip="ã“ã®ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’削除ã—ã¾ã™"/>
+ <button name="edit_media" tool_tip="ã“ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’編集ã—ã¾ã™"/>
+ <button label="æƒãˆã‚‹" label_selected="メディアを一列ã«æƒãˆã‚‹" name="button align" tool_tip="メディアテクスãƒãƒ£ã‚’一列ã«æƒãˆã¾ã™ï¼ˆæœ€åˆã«èª­ã¿è¾¼ã‚€å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼‰"/>
</panel>
</panel>
<panel label="中身" name="Contents">
@@ -475,7 +475,7 @@
é¢ç©ï¼š [AREA] 平方メートル
</text>
<button label="土地情報" label_selected="土地情報" name="button about land"/>
- <check_box label="オーナーを表示" name="checkbox show owners" tool_tip="所有者ã®ç¨®é¡žåˆ¥ã«åŒºç”»ã‚’色ã¥ã‘: ç·‘ = ã‚ãªãŸã®åœŸåœ° アクア = ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—所有地 赤 = 他人ãŒæ‰€æœ‰ã™ã‚‹åœŸåœ° 黄色 = 売り出ã—中 ç´« = オークション グレー = パブリック"/>
+ <check_box label="所有者を表示" name="checkbox show owners" tool_tip="所有者ã®ç¨®é¡žåˆ¥ã«åŒºç”»ã‚’色ã¥ã‘ã¾ã™ï¼š ç·‘ = ã‚ãªãŸã®åœŸåœ° アクア = ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—所有地 赤 = 他人ãŒæ‰€æœ‰ã™ã‚‹åœŸåœ° 黄色 = 売り出ã—中 ç´« = オークション グレー = パブリック"/>
<text name="label_parcel_modify">
区画ã®ç·¨é›†
</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_url_entry.xml b/indra/newview/skins/default/xui/ja/floater_url_entry.xml
index 9d3ca20c7c..8e09e4748a 100644
--- a/indra/newview/skins/default/xui/ja/floater_url_entry.xml
+++ b/indra/newview/skins/default/xui/ja/floater_url_entry.xml
@@ -3,11 +3,11 @@
<text name="media_label">
メディア URL:
</text>
- <combo_box left="100" name="media_entry" width="360" />
- <button label="OK" name="ok_btn" width="78"/>
+ <combo_box name="media_entry"/>
+ <button label="OK" name="ok_btn" width="38"/>
<button label="キャンセル" name="cancel_btn" width="80"/>
- <button label="クリア" name="clear_btn" />
- <text name="loading_label">
+ <button label="クリア" name="clear_btn" left_pad="76"/>
+ <text name="loading_label" left="140">
ロード中...
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_window_size.xml b/indra/newview/skins/default/xui/ja/floater_window_size.xml
index a31336c0f8..152a5f4806 100644
--- a/indra/newview/skins/default/xui/ja/floater_window_size.xml
+++ b/indra/newview/skins/default/xui/ja/floater_window_size.xml
@@ -4,7 +4,7 @@
[RES_X] x [RES_Y]
</string>
<text name="windowsize_text">
- ウィンドウã®ã‚µã‚¤ã‚ºã®è¨­å®šï¼š
+ ウィンドウã®ã‚µã‚¤ã‚ºã‚’設定:
</text>
<combo_box name="window_size_combo" tool_tip="横幅 x 高ã•">
<combo_box.item label="1000 x 700 (標準)" name="item0"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_world_map.xml b/indra/newview/skins/default/xui/ja/floater_world_map.xml
index a0f2d98adf..af9c05de91 100644
--- a/indra/newview/skins/default/xui/ja/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/ja/floater_world_map.xml
@@ -2,13 +2,13 @@
<floater name="worldmap" title="世界地図">
<panel name="layout_panel_1">
<text name="events_label">
- レジェンド
+ 表記・記å·
</text>
</panel>
<panel>
- <button label="ç¾åœ¨åœ°ã‚’表示" label_selected="ç¾åœ¨åœ°ã‚’表示" name="Show My Location" tool_tip="マップを中央ã«è¡¨ç¤ºã™ã‚‹"/>
+ <button label="ç¾åœ¨åœ°ã‚’表示" label_selected="ç¾åœ¨åœ°ã‚’表示" name="Show My Location" tool_tip="ã‚¢ãƒã‚¿ãƒ¼ã®ä½ç½®ã‚’地図ã®ä¸­å¿ƒã«è¡¨ç¤ºã—ã¾ã™"/>
<text name="me_label">
- ミー
+ 自分
</text>
<check_box label="ä½äºº" name="people_chk"/>
<text name="person_label">
@@ -23,12 +23,12 @@
土地販売
</text>
<text name="by_owner_label">
- by owner
+ 所有者ã®è²©å£²
</text>
<text name="auction_label">
土地オークション
</text>
- <button label="ホームã¸" label_selected="ホームã¸" name="Go Home" tool_tip="「ホームã€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/>
+ <button label="ホームã¸" label_selected="ホームã¸" name="Go Home" tool_tip="「ホームã€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/>
<text name="Home_label">
ホーム
</text>
@@ -50,14 +50,14 @@
</panel>
<panel>
<text name="find_on_map_label">
- 地図ã§æŽ¢ã™
+ 地図上ã§æŽ¢ã™
</text>
</panel>
<panel>
- <combo_box label="オンラインã®ãƒ•ãƒ¬ãƒ³ãƒ‰" name="friend combo" tool_tip="フレンドを地図ã«è¡¨ç¤º">
+ <combo_box label="オンラインã®ãƒ•ãƒ¬ãƒ³ãƒ‰" name="friend combo" tool_tip="フレンドを地図上ã«è¡¨ç¤ºã—ã¾ã™">
<combo_box.item label="オンラインã®ãƒ•ãƒ¬ãƒ³ãƒ‰" name="item1"/>
</combo_box>
- <combo_box label="マイ ランドマーク" name="landmark combo" tool_tip="地図ã«è¡¨ç¤ºã™ã‚‹ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯">
+ <combo_box label="マイ ランドマーク" name="landmark combo" tool_tip="地図上ã«è¡¨ç¤ºã™ã‚‹ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯">
<combo_box.item label="マイ ランドマーク" name="item1"/>
</combo_box>
<search_editor label="リージョンå" name="location" tool_tip="地域åを入力ã—ã¦ãã ã•ã„。"/>
@@ -66,9 +66,9 @@
<scroll_list.columns label="" name="icon"/>
<scroll_list.columns label="" name="sim_name"/>
</scroll_list>
- <button label="テレãƒãƒ¼ãƒˆ" label_selected="テレãƒãƒ¼ãƒˆ" name="Teleport" tool_tip="é¸æŠžã•ã‚ŒãŸãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/>
- <button label="SLurl をコピー" name="copy_slurl" tool_tip="ç¾åœ¨åœ°ã‚’ SLurl ã¨ã—ã¦ã‚³ãƒ”ーã—ã¦ã€Webã§ä½¿ç”¨ã—ã¾ã™ã€‚"/>
- <button label="é¸æŠžã—ãŸãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã‚’表示ã™ã‚‹" label_selected="目的地を表示" name="Show Destination" tool_tip="é¸æŠžã—ãŸãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚’地図ã®ä¸­å¿ƒã«ã™ã‚‹"/>
+ <button label="テレãƒãƒ¼ãƒˆ" label_selected="テレãƒãƒ¼ãƒˆ" name="Teleport" tool_tip="é¸æŠžã—ãŸå ´æ‰€ã«ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/>
+ <button label="SLurl をコピー" name="copy_slurl" tool_tip="ç¾åœ¨åœ°ã‚’ SLurl ã§ã‚³ãƒ”ーã—ã¦ã€Webã§ä½¿ç”¨ã—ã¾ã™ã€‚"/>
+ <button label="é¸æŠžã—ãŸãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã‚’表示ã™ã‚‹" label_selected="目的地を表示" name="Show Destination" tool_tip="é¸æŠžã—ãŸå ´æ‰€ã‚’地図ã®ä¸­å¿ƒã«è¡¨ç¤ºã—ã¾ã™"/>
</panel>
<panel>
<text name="zoom_label">
diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
index 1bfadf8d45..9d5ce3dada 100644
--- a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
@@ -23,5 +23,5 @@
<menu_item_call label="容姿" name="Appearance..."/>
<menu_item_call label="フレンド" name="Friends..."/>
<menu_item_call label="グループ" name="Groups..."/>
- <menu_item_call label="マイ プロフィール" name="Profile..."/>
+ <menu_item_call label="プロフィール" name="Profile..."/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml
index 76c01d6109..d02701b400 100644
--- a/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<menu name="Gear Menu">
<menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="stand_up"/>
- <menu_item_call label="マイ 容姿" name="my_appearance"/>
+ <menu_item_call label="容姿" name="my_appearance"/>
<menu_item_call label="プロフィール" name="my_profile"/>
<menu_item_call label="フレンド" name="my_friends"/>
<menu_item_call label="グループ" name="my_groups"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory.xml b/indra/newview/skins/default/xui/ja/menu_inventory.xml
index 78c0dd0a78..3d661f96e0 100644
--- a/indra/newview/skins/default/xui/ja/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory.xml
@@ -62,13 +62,13 @@
<menu_item_call label="リンクを外ã™" name="Remove Link"/>
<menu_item_call label="削除" name="Delete"/>
<menu_item_call label="システムフォルダを削除ã™ã‚‹" name="Delete System Folder"/>
- <menu_item_call label="会議ãƒãƒ£ãƒƒãƒˆé–‹å§‹" name="Conference Chat Folder"/>
+ <menu_item_call label="コンファレンスãƒãƒ£ãƒƒãƒˆã‚’開始" name="Conference Chat Folder"/>
<menu_item_call label="å†ç”Ÿ" name="Sound Play"/>
<menu_item_call label="ランドマークã®æƒ…å ±" name="About Landmark"/>
- <menu_item_call label="世界ã§å†ç”Ÿ" name="Animation Play"/>
- <menu_item_call label="ローカルã«å†ç”Ÿ" name="Animation Audition"/>
- <menu_item_call label="インスタント・メッセージをé€ä¿¡" name="Send Instant Message"/>
- <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’贈る..." name="Offer Teleport..."/>
+ <menu_item_call label="ワールドå†ç”Ÿ" name="Animation Play"/>
+ <menu_item_call label="ローカルå†ç”Ÿ" name="Animation Audition"/>
+ <menu_item_call label="インスタントメッセージをé€ä¿¡" name="Send Instant Message"/>
+ <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹..." name="Offer Teleport..."/>
<menu_item_call label="会議ãƒãƒ£ãƒƒãƒˆé–‹å§‹" name="Conference Chat"/>
<menu_item_call label="アクティブ" name="Activate"/>
<menu_item_call label="éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–" name="Deactivate"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_login.xml b/indra/newview/skins/default/xui/ja/menu_login.xml
index 42a95ac3d3..d6f13f0e59 100644
--- a/indra/newview/skins/default/xui/ja/menu_login.xml
+++ b/indra/newview/skins/default/xui/ja/menu_login.xml
@@ -24,7 +24,7 @@
<menu_item_call label="UI/色ã®è¨­å®š" name="UI/Color Settings"/>
<menu_item_call label="XUI プレビューツール" name="UI Preview Tool"/>
<menu label="UI テスト" name="UI Tests"/>
- <menu_item_call label="ウィンドウã®ã‚µã‚¤ã‚ºã®è¨­å®š..." name="Set Window Size..."/>
+ <menu_item_call label="ウィンドウã®ã‚µã‚¤ã‚ºã‚’設定..." name="Set Window Size..."/>
<menu_item_call label="利用è¦ç´„を表示" name="TOS"/>
<menu_item_call label="クリティカルメッセージを表示" name="Critical"/>
<menu_item_call label="Web ブラウザã®ãƒ†ã‚¹ãƒˆ" name="Web Browser Test"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_object.xml b/indra/newview/skins/default/xui/ja/menu_object.xml
index a161c01514..d218b48c98 100644
--- a/indra/newview/skins/default/xui/ja/menu_object.xml
+++ b/indra/newview/skins/default/xui/ja/menu_object.xml
@@ -9,8 +9,8 @@
<menu_item_call label="ズームイン" name="Zoom In"/>
<context_menu label="è£…ç€ &gt;" name="Put On">
<menu_item_call label="装ç€" name="Wear"/>
- <context_menu label="å–り付㑠&gt;" name="Object Attach"/>
- <context_menu label="HUD ã‚’å–り付㑠&gt;" name="Object Attach HUD"/>
+ <context_menu label="å–り付ã‘ã‚‹ &gt;" name="Object Attach"/>
+ <context_menu label="HUD ã‚’å–り付ã‘ã‚‹ &gt;" name="Object Attach HUD"/>
</context_menu>
<context_menu label="削除 &gt;" name="Remove">
<menu_item_call label="å–ã‚‹" name="Pie Object Take"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_groups.xml b/indra/newview/skins/default/xui/ja/menu_people_groups.xml
index 4e5dc60a3d..842d79dc4b 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_groups.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_groups.xml
@@ -3,6 +3,6 @@
<menu_item_call label="情報を表示" name="View Info"/>
<menu_item_call label="ãƒãƒ£ãƒƒãƒˆ" name="Chat"/>
<menu_item_call label="コール" name="Call"/>
- <menu_item_call label="有効化" name="Activate"/>
+ <menu_item_call label="アクティブ" name="Activate"/>
<menu_item_call label="脱退" name="Leave"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_slurl.xml b/indra/newview/skins/default/xui/ja/menu_slurl.xml
index 2e06c53494..eb24cee7e0 100644
--- a/indra/newview/skins/default/xui/ja/menu_slurl.xml
+++ b/indra/newview/skins/default/xui/ja/menu_slurl.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
<menu_item_call label="URLã«ã¤ã„ã¦" name="about_url"/>
- <menu_item_call label="URLã¸ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹" name="teleport_to_url"/>
+ <menu_item_call label="URLã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹" name="teleport_to_url"/>
<menu_item_call label="地図" name="show_on_map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index db8583ca15..c5d5914f3f 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -49,12 +49,12 @@
<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_item_call label="自然環境エディター" name="Environment Editor"/>
</menu>
</menu>
<menu label="制作" name="BuildTools">
<menu_item_check label="制作" name="Show Build Tools"/>
- <menu label="制作ツールをé¸æŠž" name="Select Tool">
+ <menu label="制作ツールをé¸æŠžã™ã‚‹" name="Select Tool">
<menu_item_call label="フォーカスツール" name="Focus"/>
<menu_item_call label="移動ツール" name="Move"/>
<menu_item_call label="編集ツール" name="Edit"/>
@@ -77,9 +77,9 @@
<menu_item_call label="é¸æŠžã—ãŸã‚‚ã®ã«ç„¦ç‚¹ã‚’åˆã‚ã›ã‚‹" name="Focus on Selection"/>
<menu_item_call label="é¸æŠžã—ãŸã‚‚ã®ã‚’ズームã™ã‚‹" name="Zoom to Selection"/>
<menu label="オブジェクト" name="Object">
- <menu_item_call label="è²·ã†" name="Menu Object Take"/>
+ <menu_item_call label="å–ã‚‹" name="Menu Object Take"/>
<menu_item_call label="コピーをå–ã‚‹" name="Take Copy"/>
- <menu_item_call label="「マイ æŒã¡ç‰©ã€ã«ä¿å­˜" name="Save Object Back to My Inventory"/>
+ <menu_item_call label="「æŒã¡ç‰©ã€ã«ä¿å­˜" name="Save Object Back to My Inventory"/>
<menu_item_call label="オブジェクトã®ä¸­èº«ã«ä¿å­˜" name="Save Object Back to Object Contents"/>
</menu>
<menu label="スクリプト" name="Scripts">
@@ -119,8 +119,8 @@
</menu>
<menu label="ヘルプ" name="Help">
<menu_item_call label="[SECOND_LIFE] ヘルプ" name="Second Life Help"/>
- <menu_item_call label="å«ŒãŒã‚‰ã›ã‚’報告" name="Report Abuse"/>
- <menu_item_call label="ãƒã‚°å ±å‘Š" name="Report Bug"/>
+ <menu_item_call label="å«ŒãŒã‚‰ã›ã‚’報告ã™ã‚‹" name="Report Abuse"/>
+ <menu_item_call label="ãƒã‚°ã‚’報告ã™ã‚‹" name="Report Bug"/>
<menu_item_call label="[APP_NAME] ã«ã¤ã„ã¦" name="About Second Life"/>
</menu>
<menu label="アドãƒãƒ³ã‚¹" name="Advanced">
diff --git a/indra/newview/skins/default/xui/ja/mime_types.xml b/indra/newview/skins/default/xui/ja/mime_types.xml
index 2f945b2010..54663a0367 100644
--- a/indra/newview/skins/default/xui/ja/mime_types.xml
+++ b/indra/newview/skins/default/xui/ja/mime_types.xml
@@ -2,13 +2,13 @@
<mimetypes name="default">
<widgetset name="web">
<label name="web_label">
- ウェブ・コンテンツ
+ Webコンテンツ
</label>
<tooltip name="web_tooltip">
- ã“ã“ã«ã‚¦ã‚§ãƒ–・コンテンツãŒã‚ã‚Šã¾ã™ã€‚
+ ã“ã“ã«WebコンテンツãŒã‚ã‚Šã¾ã™ã€‚
</tooltip>
<playtip name="web_playtip">
- ウェブ・コンテンツを表示
+ Webコンテンツを表示
</playtip>
</widgetset>
<widgetset name="movie">
@@ -119,7 +119,7 @@
</mimetype>
<mimetype name="application/xhtml+xml">
<label name="application/xhtml+xml_label">
- ウェブ・ページ (XHTML)
+ Webページ (XHTML)
</label>
</mimetype>
<mimetype name="application/x-director">
@@ -184,7 +184,7 @@
</mimetype>
<mimetype menu="1" name="text/html">
<label name="text/html_label">
- ウェブ・ページ
+ Webページ
</label>
</mimetype>
<mimetype menu="1" name="text/plain">
diff --git a/indra/newview/skins/default/xui/ja/panel_bottomtray.xml b/indra/newview/skins/default/xui/ja/panel_bottomtray.xml
index 414413a980..81a852522b 100644
--- a/indra/newview/skins/default/xui/ja/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/ja/panel_bottomtray.xml
@@ -17,11 +17,11 @@
<button label="視界" name="camera_btn" tool_tip="カメラコントロールã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/>
</layout_panel>
<layout_panel name="snapshot_panel">
- <button label="" name="snapshots" tool_tip="スナップショットを撮る"/>
+ <button label="" name="snapshots" tool_tip="スナップショットを撮りã¾ã™"/>
</layout_panel>
<layout_panel name="im_well_panel">
<chiclet_im_well name="im_well">
- <button name="Unread IM messages" tool_tip="Conversations"/>
+ <button name="Unread IM messages" tool_tip="会話"/>
</chiclet_im_well>
</layout_panel>
<layout_panel name="notification_well_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml b/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml
index 7825d81c53..f2e3e6e993 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_alpha_panel">
<panel name="avatar_alpha_color_panel">
- <texture_picker label="アルファ(下)" name="Lower Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="アルファ(上)" name="Upper Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="頭部ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Head Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="アルファ&#10;(下)" name="Lower Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="アルファ&#10;(上)" name="Upper Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="頭部ã®ã‚¢&#10;ルファ" name="Head Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
<texture_picker label="ç›®ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Eye Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
<texture_picker label="髪ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Hair Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
index 2a850ab29c..d1a2b31934 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
@@ -45,7 +45,7 @@
<text name="my_account_link" value="[[URL] マイアカウントã«ç§»å‹•]"/>
<text name="acc_status_text" value="ä½äººã€‚ 支払情報未登録。"/>
<text name="title_partner_text" value="マイパートナー:"/>
- <text name="partner_edit_link" value="[[URL] 編集]"/>
+ <text name="partner_edit_link" value="[[URL] 編集]" width="100"/>
<panel name="partner_data_panel">
<name_box name="partner_text" value="[FIRST] [LAST]"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml
index d6aec87b45..78ddae47f9 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_tattoo_panel">
<panel name="avatar_tattoo_color_panel">
- <texture_picker label="頭部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Head Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
- <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
- <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
+ <texture_picker label="頭部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Head Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž" width="70"/>
+ <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž" width="70"/>
+ <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž" width="70"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_friends.xml b/indra/newview/skins/default/xui/ja/panel_friends.xml
index 80a68f8258..97e58ceaed 100644
--- a/indra/newview/skins/default/xui/ja/panel_friends.xml
+++ b/indra/newview/skins/default/xui/ja/panel_friends.xml
@@ -4,7 +4,7 @@
複数ã®ãƒ•ãƒ¬ãƒ³ãƒ‰
</string>
<scroll_list name="friend_list" tool_tip="複数ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’é¸æŠžã™ã‚‹ã«ã¯ã€Shiftキーã¾ãŸã¯Ctrlキーを押ã—ãªãŒã‚‰åå‰ã‚’クリックã—ã¾ã™ã€‚">
- <column name="icon_online_status" tool_tip="オンライン・ステータス"/>
+ <column name="icon_online_status" tool_tip="オンライン状æ³"/>
<column label="åå‰" name="friend_name" tool_tip="åå‰"/>
<column name="icon_visible_online" tool_tip="フレンドã¯ã€ã‚ãªãŸãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‹ã©ã†ã‹ç¢ºèªã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/>
<column name="icon_visible_map" tool_tip="フレンドã¯ã€åœ°å›³ã§ã‚ãªãŸã®å±…場所を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/>
@@ -15,18 +15,18 @@
<text name="friend_name_label" right="-10">
フレンドをé¸æŠžã—ã¦æ¨©åˆ©ã‚’変更...
</text>
- <check_box label="オンライン・ステータスã®ç¢ºèªã‚’許å¯ã™ã‚‹" name="online_status_cb" tool_tip="コーリングカードã‚ã‚‹ã„ã¯ãƒ•ãƒ¬ãƒ³ãƒ‰ãƒªã‚¹ãƒˆã§ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’確èªã§ãるよã†è¨­å®š"/>
- <check_box label="世界地図上ã§ã‚ãªãŸã®å±…場所を検索å¯èƒ½ã«ã™ã‚‹" name="map_status_cb" tool_tip="ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ãŒåœ°å›³ã§ç§ã®ä½ç½®ã‚’発見ã§ãるよã†ã«è¨­å®š"/>
- <check_box label="オブジェクトã®ä¿®æ­£ã‚’許å¯ã™ã‚‹" name="modify_status_cb" tool_tip="ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ãŒã‚ªãƒ–ジェクトを改造ã§ãる許å¯ã‚’与ãˆã‚‹"/>
+ <check_box label="オンライン状æ³ã®ç¢ºèªã‚’許å¯ã™ã‚‹" name="online_status_cb" tool_tip="コーリングカードã‚ã‚‹ã„ã¯ãƒ•ãƒ¬ãƒ³ãƒ‰ãƒªã‚¹ãƒˆã§ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ³ã‚’確èªã§ãるよã†è¨­å®šã—ã¾ã™"/>
+ <check_box label="世界地図上ã§ã‚ãªãŸã®å±…場所を検索å¯èƒ½ã«ã™ã‚‹" name="map_status_cb" tool_tip="ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ãŒåœ°å›³ã§ç§ã®ä½ç½®ã‚’発見ã§ãるよã†ã«è¨­å®šã—ã¾ã™"/>
+ <check_box label="オブジェクトã®ä¿®æ­£ã‚’許å¯ã™ã‚‹" name="modify_status_cb" tool_tip="ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã«ç§ã®ã‚ªãƒ–ジェクトを改造ã™ã‚‹è¨±å¯ã‚’与ãˆã¾ã™"/>
<text name="process_rights_label">
権利変更をプロセス中...
</text>
</panel>
<pad left="-95"/>
- <button label="IM/コール" name="im_btn" tool_tip="インスタントメッセージ・セッションを開ã" width="90"/>
+ <button label="IM・コール" name="im_btn" tool_tip="インスタントメッセージ・セッションを開ãã¾ã™ã€‚" width="90"/>
<button label="プロフィール" name="profile_btn" tool_tip="写真ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãŠã‚ˆã³ãã®ä»–ã®æƒ…報を表示ã—ã¾ã™ã€‚" width="90"/>
- <button label="テレãƒãƒ¼ãƒˆ" name="offer_teleport_btn" tool_tip="ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã«ã€ã‚ãªãŸã®ç¾åœ¨ã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã¾ã§ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’申ã—出ã¾ã™ã€‚" width="90"/>
- <button label="支払ã†" name="pay_btn" tool_tip="リンデンドル (L$) ã‚’ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã«ã‚ã’ã‚‹" width="90"/>
+ <button label="テレãƒãƒ¼ãƒˆ" name="offer_teleport_btn" tool_tip="ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã«ã€ã‚ãªãŸã®ç¾åœ¨åœ°ã¸ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’申ã—出ã¾ã™ã€‚" width="90"/>
+ <button label="支払ã†" name="pay_btn" tool_tip="リンデンドル (L$) ã‚’ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã«ã‚ã’ã¾ã™ã€‚" width="90"/>
<button label="削除" name="remove_btn" tool_tip="ã“ã®äººç‰©ã‚’フレンドリストã‹ã‚‰å¤–ã—ã¾ã™ã€‚" width="90"/>
- <button label="追加" name="add_btn" tool_tip="フレンド登録を申ã—出る" width="90"/>
+ <button label="追加" name="add_btn" tool_tip="フレンド登録を申ã—出ã¾ã™ã€‚" width="90"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml b/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml
index 1c89675c1e..f7f575206a 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml
@@ -5,7 +5,7 @@
<button label="グループ情報" name="group_info_btn"/>
</layout_panel>
<layout_panel name="call_btn_panel">
- <button label="グループã«ã‚³ãƒ¼ãƒ«" name="call_btn"/>
+ <button label="グループコール" name="call_btn"/>
</layout_panel>
<layout_panel name="end_call_btn_panel">
<button label="コール終了" name="end_call_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_general.xml b/indra/newview/skins/default/xui/ja/panel_group_general.xml
index 538f3800bd..247294c158 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_general.xml
@@ -9,7 +9,7 @@
一般的ãªã‚°ãƒ«ãƒ¼ãƒ—情報ãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚
</panel.string>
<panel.string name="incomplete_member_data_str">
- メンãƒãƒ¼ãƒ»ãƒ‡ãƒ¼ã‚¿ã‚’検索
+ メンãƒãƒ¼ã®ãƒ‡ãƒ¼ã‚¿ã‚’検索
</panel.string>
<text_editor name="charter">
グループã®ç†å¿µã€æŒ‡é‡ã‚’記入ã—ã¦ãã ã•ã„
diff --git a/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml
index 0af1ce2ef2..252220b64d 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml
@@ -31,7 +31,7 @@
</accordion>
<panel name="button_row">
<button label="作æˆ" label_selected="æ–°ã—ã„グループ" name="btn_create"/>
- <button label="グループãƒãƒ£ãƒƒãƒˆ" name="btn_chat"/>
+ <button label="グループãƒãƒ£ãƒƒãƒˆ" name="btn_chat" width="100"/>
<button label="グループコール" name="btn_call"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="btn_apply"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_invite.xml b/indra/newview/skins/default/xui/ja/panel_group_invite.xml
index dc58359133..a21b340fdd 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_invite.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="メンãƒãƒ¼ã‚’招待" name="invite_panel">
<panel.string name="confirm_invite_owner_str">
- 本当ã«æ–°ã—ã„所有者を招待ã—ã¾ã™ã‹?ã“ã®æ“作ã¯å–り消ã—ã§ãã¾ã›ã‚“。
+ 本当ã«æ–°ã—ã„所有者を招待ã—ã¾ã™ã‹ï¼Ÿã“ã®æ“作ã¯å–り消ã—ã§ãã¾ã›ã‚“。
</panel.string>
<panel.string name="loading">
(ローディング...)
diff --git a/indra/newview/skins/default/xui/ja/panel_group_land_money.xml b/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
index cfbc51a44e..0f014bcd2f 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
@@ -18,12 +18,12 @@
</text>
<scroll_list name="group_parcel_list">
<column label="区画" name="name"/>
- <column label="地域(リージョン)" name="location"/>
+ <column label="地域" name="location"/>
<column label="種類" name="type"/>
<column label="é¢ç©" name="area"/>
<column label="" name="hidden"/>
</scroll_list>
- <button label="地図" label_selected="地図" name="map_button"/>
+ <button label="地図" label_selected="地図" name="map_button" width="60"/>
<text name="total_contributed_land_label">
寄付åˆè¨ˆï¼š
</text>
@@ -48,10 +48,10 @@
<string name="land_contrib_error">
土地ã®è²¢çŒ®ã‚’設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
</string>
- <text name="your_contribution_units">
+ <text name="your_contribution_units" width="80">
平方メートル
</text>
- <text name="your_contribution_max_value">
+ <text name="your_contribution_max_value" width="100">
(最大 [AMOUNT])
</text>
<text name="group_over_limit_text">
diff --git a/indra/newview/skins/default/xui/ja/panel_group_notices.xml b/indra/newview/skins/default/xui/ja/panel_group_notices.xml
index c5168c4d7c..e33d3d854e 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_notices.xml
@@ -21,8 +21,8 @@
<text name="notice_list_none_found">
見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ
</text>
- <button label="æ–°ã—ã„通知を作æˆ" label_selected="æ–°ã—ã„通知を作æˆ" name="create_new_notice" tool_tip="æ–°ã—ã„通知を作æˆ"/>
- <button label="更新" label_selected="リスト更新" name="refresh_notices" tool_tip="通知リストを更新"/>
+ <button label="æ–°ã—ã„通知を作æˆ" label_selected="æ–°ã—ã„通知を作æˆ" name="create_new_notice" tool_tip="æ–°ã—ã„通知を作æˆã—ã¾ã™"/>
+ <button label="æ›´æ–°" label_selected="リスト更新" name="refresh_notices" tool_tip="通知リストを更新ã—ã¾ã™"/>
<panel label="æ–°ã—ã„通知を作æˆ" name="panel_create_new_notice">
<text name="lbl">
通知を作æˆ
@@ -31,7 +31,7 @@
件å:
</text>
<text name="lbl4">
- メッセージ:
+ 内容:
</text>
<text name="lbl5">
添付:
@@ -54,7 +54,7 @@
件å:
</text>
<text name="lbl4">
- メッセージ:
+ 内容:
</text>
<button label="添付アイテムを開ã" label_selected="添付物を開ã" name="open_attachment"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_groups.xml b/indra/newview/skins/default/xui/ja/panel_groups.xml
index 785fd868ab..de81a6431a 100644
--- a/indra/newview/skins/default/xui/ja/panel_groups.xml
+++ b/indra/newview/skins/default/xui/ja/panel_groups.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="groups">
<text name="groupdesc">
- アクティブãªï½¸ï¾žï¾™ï½°ï¾Œï¾Ÿåã¯å¤ªå­—ã§è¡¨ç¤ºã•ã‚Œã¦ã„ã¾ã™
+ アクティブãªã‚°ãƒ«ãƒ¼ãƒ—ã¯å¤ªå­—ã§è¡¨ç¤ºã•ã‚Œã¦ã„ã¾ã™
</text>
- <text name="groupcount">
- ã‚ãªãŸã¯[COUNT] グループã«æ‰€å±žã—ã¦ã„ã¾ã™ (最大[MAX])
+ <text name="groupcount" width="270">
+ [COUNT] ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«æ‰€å±žã—ã¦ã„ã¾ã™ (最大[MAX])
</text>
- <button label="IM/コール" name="IM"
+ <button label="IM・コール" name="IM"
tool_tip="インスタントメッセージ・セッションを開ã" />
<button label="情報" name="Info" />
<button label="アクティブ" name="Activate" />
diff --git a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml
index 9129c66a45..87477c2651 100644
--- a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml
@@ -36,7 +36,7 @@
</panel>
<panel name="landmark_edit_panel">
<text name="title_label" value="タイトル:"/>
- <text name="notes_label" value="個人的メモ:"/>
+ <text name="notes_label" value="メモ:"/>
<text name="folder_label" value="ランドマークã®ä½ç½®ï¼š"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_landmarks.xml b/indra/newview/skins/default/xui/ja/panel_landmarks.xml
index 45767e8c50..151fbf33f2 100644
--- a/indra/newview/skins/default/xui/ja/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/ja/panel_landmarks.xml
@@ -7,8 +7,8 @@
<accordion_tab name="tab_library" title="ライブラリ"/>
</accordion>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示"/>
- <button name="add_btn" tool_tip="æ–°ã—ã„ランドマークを追加"/>
- <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’削除"/>
+ <button name="options_gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示ã—ã¾ã™"/>
+ <button name="add_btn" tool_tip="æ–°ã—ã„ランドマークを追加ã—ã¾ã™"/>
+ <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’削除ã—ã¾ã™"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml
index 82c52abf38..1d18a86b53 100644
--- a/indra/newview/skins/default/xui/ja/panel_login.xml
+++ b/indra/newview/skins/default/xui/ja/panel_login.xml
@@ -23,12 +23,12 @@
<text name="start_location_text">
開始地点:
</text>
- <combo_box name="start_location_combo">
+ <combo_box name="start_location_combo" width="160">
<combo_box.item label="最後ã«ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€" name="MyLastLocation"/>
<combo_box.item label="ホーム" name="MyHome"/>
<combo_box.item label="<地域åを入力>" name="Typeregionname"/>
</combo_box>
- <button label="ログイン" name="connect_btn"/>
+ <button label="ログイン" name="connect_btn" left_pad="30" width="60"/>
</layout_panel>
<layout_panel name="links">
<text name="create_new_account_text">
diff --git a/indra/newview/skins/default/xui/ja/panel_main_inventory.xml b/indra/newview/skins/default/xui/ja/panel_main_inventory.xml
index d533ce5e0d..36c7b75f97 100644
--- a/indra/newview/skins/default/xui/ja/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_main_inventory.xml
@@ -9,9 +9,9 @@
<inventory_panel label="最新" name="Recent Items"/>
</tab_container>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示"/>
- <button name="add_btn" tool_tip="æ–°ã—ã„アイテムã®è¿½åŠ "/>
- <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’削除"/>
+ <button name="options_gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示ã—ã¾ã™"/>
+ <button name="add_btn" tool_tip="æ–°ã—ã„アイテムを追加ã—ã¾ã™"/>
+ <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’削除ã—ã¾ã™"/>
</panel>
<menu_bar name="Inventory Menu">
<menu label="ファイル" name="File">
@@ -32,7 +32,7 @@
<menu label="æ–°è¦ä½œæˆ" name="Create">
<menu_item_call label="フォルダ" name="New Folder"/>
<menu_item_call label="スクリプト" name="New Script"/>
- <menu_item_call label="æ–°ã—ã„ノートカード" name="New Note"/>
+ <menu_item_call label="ノートカード" name="New Note"/>
<menu_item_call label="ジェスãƒãƒ£ãƒ¼" name="New Gesture"/>
<menu label="衣類" name="New Clothes">
<menu_item_call label="シャツ" name="New Shirt"/>
@@ -40,7 +40,7 @@
<menu_item_call label="é´" name="New Shoes"/>
<menu_item_call label="é´ä¸‹" name="New Socks"/>
<menu_item_call label="ジャケット" name="New Jacket"/>
- <menu_item_call label="シャツ" name="New Skirt"/>
+ <menu_item_call label="スカート" name="New Skirt"/>
<menu_item_call label="手袋" name="New Gloves"/>
<menu_item_call label="下ç€ï¼ˆä¸Šï¼‰" name="New Undershirt"/>
<menu_item_call label="下ç€ï¼ˆä¸‹ï¼‰" name="New Underpants"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml b/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml
index 74e414c381..eba26bbe3d 100644
--- a/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml
@@ -20,7 +20,7 @@
<check_box initial_value="false" label="自動ズーム" name="auto_zoom"/>
<check_box initial_value="false" label="自動メディアå†ç”Ÿ" name="auto_play"/>
<text name="media_setting_note">
- 注: ä½äººã¯ã“ã®è¨­å®šã‚’無視ã§ãã¾ã™
+ 注æ„: ä½äººã¯ã“ã®è¨­å®šã‚’無視ã§ãã¾ã™
</text>
<check_box initial_value="false" label="オブジェクトã®è¡¨é¢ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã®è‡ªå‹•ã‚¹ã‚±ãƒ¼ãƒ«" name="auto_scale"/>
<text name="size_label">
diff --git a/indra/newview/skins/default/xui/ja/panel_media_settings_security.xml b/indra/newview/skins/default/xui/ja/panel_media_settings_security.xml
index 7822123a30..6accbd4852 100644
--- a/indra/newview/skins/default/xui/ja/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/ja/panel_media_settings_security.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="セキュリティ" name="Media Settings Security">
- <check_box initial_value="false" label="指定ã—ãŸURLパターンã«ã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã™ã‚‹" name="whitelist_enable"/>
+ <check_box initial_value="false" label="指定ã—ãŸURLパターンã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã™ã‚‹" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
ホームページã«å¤±æ•—ã—ãŸã‚¨ãƒ³ãƒˆãƒªãƒ¼ãŒãƒžãƒ¼ã‚¯ã•ã‚Œã¾ã—ãŸï¼š
</text>
diff --git a/indra/newview/skins/default/xui/ja/panel_my_profile.xml b/indra/newview/skins/default/xui/ja/panel_my_profile.xml
index 4cce3798cf..e74a726d11 100644
--- a/indra/newview/skins/default/xui/ja/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_my_profile.xml
@@ -28,7 +28,7 @@
<icon label="" name="real_world_edit_icon" tool_tip="下ã®ã€Œãƒ—ロフィールã®ç·¨é›†ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ç”»åƒã‚’変更ã—ã¾ã™"/>
<text name="title_rw_descr_text" value="ç¾å®Ÿä¸–界:"/>
</panel>
- <text name="title_member_text" value="ä½äººã¨ãªã£ãŸæ—¥ï¼š"/>
+ <text name="title_member_text" value="メンãƒãƒ¼ç™»éŒ²ï¼š"/>
<text name="title_acc_status_text" value="アカウントã®çŠ¶æ…‹ï¼š"/>
<text name="acc_status_text">
ä½äººã€‚ 支払情報未登録。
diff --git a/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml b/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml
index a154442095..b271e86852 100644
--- a/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="navigation_bar">
<panel name="navigation_panel">
- <button name="back_btn" tool_tip="å‰ã®å ´æ‰€"/>
- <button name="forward_btn" tool_tip="次ã®å ´æ‰€"/>
+ <button name="back_btn" tool_tip="å‰ã®å ´æ‰€ã¸æˆ»ã‚Šã¾ã™"/>
+ <button name="forward_btn" tool_tip="次ã®å ´æ‰€ã¸é€²ã¿ã¾ã™"/>
<button name="home_btn" tool_tip="「ホームã€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/>
<location_input label="場所" name="location_combo"/>
<search_combo_box label="検索" name="search_combo_box" tool_tip="検索">
diff --git a/indra/newview/skins/default/xui/ja/panel_notes.xml b/indra/newview/skins/default/xui/ja/panel_notes.xml
index 1948c54359..6023bf125f 100644
--- a/indra/newview/skins/default/xui/ja/panel_notes.xml
+++ b/indra/newview/skins/default/xui/ja/panel_notes.xml
@@ -15,9 +15,9 @@
<layout_panel name="notes_buttons_panel">
<button label="フレンド登録" name="add_friend" tool_tip="フレンド登録を申ã—出ã¾ã™"/>
<button label="IM" name="im" tool_tip="インスタントメッセージを開ãã¾ã™"/>
- <button label="コール" name="call" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/>
- <button label="地図" name="show_on_map_btn" tool_tip="ä½äººã‚’地図上ã§è¡¨ç¤ºã™ã‚‹"/>
- <button label="テレãƒãƒ¼ãƒˆ" name="teleport" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹"/>
+ <button label="コール" name="call" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã—ã¾ã™"/>
+ <button label="地図" name="show_on_map_btn" tool_tip="ä½äººã‚’地図上ã§è¡¨ç¤ºã—ã¾ã™"/>
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml
index a109b1ab51..7681ee461f 100644
--- a/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml
@@ -5,10 +5,10 @@
<inventory_panel label="ç€ç”¨ä¸­" name="cof_accordionpanel"/>
</tab_container>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示"/>
- <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’削除"/>
- <button label="アウトフィットをä¿å­˜ã™ã‚‹" name="make_outfit_btn" tool_tip="容姿をアウトフィットã«ä¿å­˜ã™ã‚‹"/>
- <button label="装ç€" name="wear_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¦ãƒˆãƒ•ã‚£ãƒƒãƒˆã‚’ç€ç”¨ã™ã‚‹"/>
+ <button name="options_gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示ã—ã¾ã™"/>
+ <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’削除ã—ã¾ã™"/>
+ <button label="アウトフィットをä¿å­˜ã™ã‚‹" name="make_outfit_btn" tool_tip="容姿をアウトフィットã«ä¿å­˜ã—ã¾ã™" width="140"/>
+ <button label="装ç€" name="wear_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¦ãƒˆãƒ•ã‚£ãƒƒãƒˆã‚’ç€ç”¨ã—ã¾ã™"/>
<button label="M" name="look_edit_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_people.xml b/indra/newview/skins/default/xui/ja/panel_people.xml
index c955cf6e48..0c3690a10c 100644
--- a/indra/newview/skins/default/xui/ja/panel_people.xml
+++ b/indra/newview/skins/default/xui/ja/panel_people.xml
@@ -23,15 +23,15 @@
</accordion>
<panel label="bottom_panel" name="bottom_panel">
<button name="friends_viewsort_btn" tool_tip="オプション"/>
- <button name="add_btn" tool_tip="フレンド登録を申ã—出る"/>
- <button name="del_btn" tool_tip="é¸æŠžã—ãŸäººã‚’フレンドリストã‹ã‚‰å‰Šé™¤"/>
+ <button name="add_btn" tool_tip="フレンド登録を申ã—出ã¾ã™"/>
+ <button name="del_btn" tool_tip="é¸æŠžã—ãŸäººã‚’フレンドリストã‹ã‚‰å‰Šé™¤ã—ã¾ã™"/>
</panel>
</panel>
<panel label="グループ" name="groups_panel">
<panel label="bottom_panel" name="bottom_panel">
<button name="groups_viewsort_btn" tool_tip="オプション"/>
- <button name="plus_btn" tool_tip="グループã«å‚加 / æ–°è¦ã‚°ãƒ«ãƒ¼ãƒ—を作æˆ"/>
- <button name="activate_btn" tool_tip="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—をアクティベート"/>
+ <button name="plus_btn" tool_tip="グループã«å‚加 / æ–°è¦ã‚°ãƒ«ãƒ¼ãƒ—を作æˆã—ã¾ã™"/>
+ <button name="activate_btn" tool_tip="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—をアクティブã«ã—ã¾ã™"/>
</panel>
</panel>
<panel label="最新" name="recent_panel">
@@ -42,13 +42,13 @@
</panel>
</tab_container>
<panel name="button_bar">
- <button label="プロフィール" name="view_profile_btn" tool_tip="写真ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãã®ä»–ä½äººæƒ…報を表示"/>
- <button label="IM" name="im_btn" tool_tip="インスタントメッセージを開ã"/>
- <button label="コール" name="call_btn" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/>
+ <button label="プロフィール" name="view_profile_btn" tool_tip="写真ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãã®ä»–ä½äººæƒ…報を表示ã—ã¾ã™"/>
+ <button label="IM" name="im_btn" tool_tip="インスタントメッセージを開ãã¾ã™"/>
+ <button label="コール" name="call_btn" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã—ã¾ã™"/>
<button label="共有" name="share_btn"/>
- <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹"/>
- <button label="グループ情報" name="group_info_btn" tool_tip="グループ情報を表示"/>
- <button label="グループãƒãƒ£ãƒƒãƒˆ" name="chat_btn" tool_tip="ãƒãƒ£ãƒƒãƒˆã‚’開始"/>
- <button label="グループã«ã‚³ãƒ¼ãƒ«ã™ã‚‹" name="group_call_btn" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/>
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/>
+ <button label="グループ情報" name="group_info_btn" tool_tip="グループ情報を表示ã—ã¾ã™"/>
+ <button label="グループãƒãƒ£ãƒƒãƒˆ" name="chat_btn" tool_tip="ãƒãƒ£ãƒƒãƒˆã‚’開始ã—ã¾ã™"/>
+ <button label="グループコール" name="group_call_btn" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚³ãƒ¼ãƒ«ã—ã¾ã™"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_picks.xml b/indra/newview/skins/default/xui/ja/panel_picks.xml
index f74bf7a073..4f58c032da 100644
--- a/indra/newview/skins/default/xui/ja/panel_picks.xml
+++ b/indra/newview/skins/default/xui/ja/panel_picks.xml
@@ -10,8 +10,8 @@
<button name="new_btn" tool_tip="ç¾åœ¨åœ°ã®æ–°ã—ã„ピックã€ã¾ãŸã¯ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã‚’作æˆã—ã¾ã™"/>
</panel>
<panel name="buttons_cucks">
- <button label="情報" name="info_btn" tool_tip="ピックã®æƒ…報を表示"/>
- <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="該当ã™ã‚‹ã‚¨ãƒªã‚¢ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/>
- <button label="地図" name="show_on_map_btn" tool_tip="世界地図ã«è©²å½“ã™ã‚‹ã‚¨ãƒªã‚¢ã‚’表示"/>
+ <button label="情報" name="info_btn" tool_tip="ピックã®æƒ…報を表示ã—ã¾ã™"/>
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="該当ã™ã‚‹ã‚¨ãƒªã‚¢ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/>
+ <button label="地図" name="show_on_map_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 ef4b71c4aa..b9a0744372 100644
--- a/indra/newview/skins/default/xui/ja/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_place_profile.xml
@@ -86,9 +86,10 @@
<button label="土地情報" name="about_land_btn"/>
</panel>
</accordion_tab>
- <accordion_tab name="region_information_tab" title="リージョン">
+ <accordion_tab name="region_information_tab" title="リージョン(地域)
+ ">
<panel>
- <text name="region_name_label" value="リージョン:"/>
+ <text name="region_name_label" value="地域:"/>
<text name="region_name" value="Mooseland"/>
<text name="region_type_label" value="種類:"/>
<text name="region_type" value="Moose"/>
@@ -105,7 +106,7 @@
</accordion_tab>
<accordion_tab name="estate_information_tab" title="エステート(ä¸å‹•ç”£ï¼‰">
<panel>
- <text name="estate_name_label" value="エステート(ä¸å‹•ç”£ï¼‰ï¼š"/>
+ <text name="estate_name_label" value="ä¸å‹•ç”£ï¼š"/>
<text name="estate_rating_label" value="レーティング区分:"/>
<text name="estate_owner_label" value="所有者:"/>
<text name="covenant_label" value="約款:"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml
index 16af659326..f0780a6cf8 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml
@@ -6,9 +6,9 @@
<check_box label="リンデンドルを使用・å—ã‘å–ã‚‹ã¨ã" name="notify_money_change_checkbox"/>
<check_box label="フレンドãŒãƒ­ã‚°ã‚¢ã‚¦ãƒˆãƒ»ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹ã¨ã" name="friends_online_notify_checkbox"/>
<text name="show_label" width="300">
- 常ã«è¡¨ç¤ºã™ã‚‹é€šçŸ¥ï¼š
+ 常ã«è¡¨ç¤ºã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼š
</text>
<text name="dont_show_label">
- 表示ã—ãªã„通知:
+ 表示ã—ãªã„メッセージ:
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
index ece18a75ca..73d0855273 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
@@ -7,27 +7,27 @@
</radio_group>
<color_swatch label="自分" name="user"/>
<text name="text_box1">
- ミー
+ 自分
</text>
<color_swatch label="ãã®ä»–" name="agent"/>
<text name="text_box2">
- ãã®ä»–
+ 他人
</text>
<color_swatch label="IM" name="im"/>
<text name="text_box3">
IM
</text>
- <color_swatch label="システム" name="system"/>
+ <color_swatch label="システム" name="system"/>
<text name="text_box4">
- システム
+ システム
</text>
<color_swatch label="エラー" name="script_error"/>
<text name="text_box5">
エラー
</text>
- <color_swatch label="オブジェクト" name="objects"/>
+ <color_swatch label="オブジェクト" name="objects"/>
<text name="text_box6">
- オブジェクト
+ オブジェクト
</text>
<color_swatch label="所有者" name="owner"/>
<text name="text_box7">
@@ -37,9 +37,9 @@
<text name="text_box9">
URL
</text>
- <check_box initial_value="true" label="ãƒãƒ£ãƒƒãƒˆä¸­ã¯ã‚¿ã‚¤ãƒ”ング動作ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†ç”Ÿ" name="play_typing_animation"/>
- <check_box label="オフライン時ã«å—ã‘å–ã£ãŸ IM をメールã§é€ä¿¡" name="send_im_to_email"/>
- <check_box label="文字ãƒãƒ£ãƒƒãƒˆã®å±¥æ­´ã‚’有効ã«ã™ã‚‹" name="plain_text_chat_history"/>
+ <check_box initial_value="true" label="ãƒãƒ£ãƒƒãƒˆä¸­ã«ã‚¿ã‚¤ãƒ”ング動作ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†ç”Ÿ" name="play_typing_animation"/>
+ <check_box label="オフライン時ã«å—ã‘å–ã£ãŸ IM をメールã§å—ä¿¡" name="send_im_to_email"/>
+ <check_box label="ãƒãƒ£ãƒƒãƒˆå±¥æ­´ã«æ–‡å­—ã ã‘ã§è¡¨ç¤ºã™ã‚‹" name="plain_text_chat_history"/>
<radio_group name="chat_window" tool_tip="インスタントメッセージを別ウィンドウã€ã¾ãŸã¯1ã¤ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã«è¤‡æ•°ã‚¿ãƒ–ã§è¡¨ç¤ºï¼ˆè¦å†èµ·å‹•ï¼‰">
<radio_item label="複数ウィンドウ" name="radio" value="0"/>
<radio_item label="1ã¤ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="radio2" value="1"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
index 765662b96a..f216c3acbc 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
@@ -33,7 +33,7 @@
</text>
<combo_box name="start_location_combo">
<combo_box.item label="最後ã«ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€" name="MyLastLocation" tool_tip="常ã«æœ€å¾Œã«ã„ãŸå ´æ‰€ã«ãƒ­ã‚°ã‚¤ãƒ³"/>
- <combo_box.item label="自宅(ホーム)" name="MyHome" tool_tip="常ã«è‡ªå®…(ホーム)ã«ãƒ­ã‚°ã‚¤ãƒ³"/>
+ <combo_box.item label="ホーム" name="MyHome" tool_tip="常ã«ãƒ›ãƒ¼ãƒ ï¼ˆè‡ªå®…)ã«ãƒ­ã‚°ã‚¤ãƒ³"/>
</combo_box>
<check_box initial_value="true" label="ログイン画é¢ã«è¡¨ç¤ºã™ã‚‹" name="show_location_checkbox"/>
<text name="name_tags_textbox">
@@ -48,7 +48,7 @@
<check_box initial_value="true" label="å°ã•ã„ã‚¢ãƒã‚¿ãƒ¼å" name="small_avatar_names_checkbox"/>
<check_box label="グループタイトルを表示" name="show_all_title_checkbox1"/>
<text name="effects_color_textbox">
- ç§ã®ãƒ“ームã®è‰²ï¼š
+ ビームã®è‰²ï¼š
</text>
<text name="title_afk_text">
一時退席ã¾ã§ã®æ™‚間:
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
index 191748fe91..8df829c296 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
@@ -55,7 +55,7 @@
<text name="AvatarRenderingText">
ã‚¢ãƒã‚¿ãƒ¼è¡¨ç¤ºï¼š
</text>
- <check_box initial_value="true" label="ã‚¢ãƒã‚¿ãƒ¼ã®ç²¾åº¦ã‚’上ã’ã‚‹" name="AvatarImpostors"/>
+ <check_box initial_value="true" label="ã‚¢ãƒã‚¿ãƒ¼ã®æ画を簡略化" name="AvatarImpostors"/>
<check_box initial_value="true" label="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚¹ã‚­ãƒ‹ãƒ³ã‚°" name="AvatarVertexProgram"/>
<check_box initial_value="true" label="ã‚¢ãƒã‚¿ãƒ¼ã®å¸ƒ" name="AvatarCloth"/>
<slider label="æç”»è·é›¢ï¼š" name="DrawDistance"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
index 7a7cb8b96b..12e8b04f84 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
@@ -11,13 +11,13 @@
<check_box label="フレンドã¨ã‚°ãƒ«ãƒ¼ãƒ—以外ã‹ã‚‰ã¯ã‚³ãƒ¼ãƒ«ã¨IMã‚’å—ä¿¡ã—ãªã„" name="voice_call_friends_only_check"/>
<check_box label="コールãŒçµ‚了ã—ãŸã‚‰ãƒžã‚¤ã‚¯ã®ã‚¹ã‚¤ãƒƒãƒã‚’切る" name="auto_disengage_mic_check"/>
<check_box label="Cookieã‚’å—ã‘入れる" name="cookies_enabled"/>
- <check_box label="メディアãŒæœ‰åŠ¹ã§ã™" name="media_enabled"/>
+ <check_box label="メディアを有効ã«ã™ã‚‹" name="media_enabled"/>
<check_box label="メディアを自動å†ç”Ÿã™ã‚‹" name="autoplay_enabled"/>
<text name="Logs:">
ログ:
</text>
- <check_box label="コンピューターã«è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒ­ã‚°ã‚’ä¿å­˜ã™ã‚‹" name="log_nearby_chat"/>
- <check_box label="コンピューター㫠IM ログをä¿å­˜ã™ã‚‹" name="log_instant_messages"/>
+ <check_box label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒ­ã‚°ã‚’コンピューターã«ä¿å­˜ã™ã‚‹" name="log_nearby_chat"/>
+ <check_box label="IM ログをコンピューターã«ä¿å­˜ã™ã‚‹" name="log_instant_messages"/>
<check_box label="タイムスタンプを追加ã™ã‚‹" name="show_timestamps_check_im"/>
<text name="log_path_desc">
ログã®ä¿å­˜å ´æ‰€ï¼š
diff --git a/indra/newview/skins/default/xui/ja/panel_profile.xml b/indra/newview/skins/default/xui/ja/panel_profile.xml
index 98969f5ab3..8968b7c61e 100644
--- a/indra/newview/skins/default/xui/ja/panel_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_profile.xml
@@ -26,7 +26,7 @@
<panel name="first_life_image_panel">
<text name="title_rw_descr_text" value="ç¾å®Ÿä¸–界:"/>
</panel>
- <text name="title_member_text" value="ä½äººã¨ãªã£ãŸæ—¥ï¼š"/>
+ <text name="title_member_text" value="ä½äººç™»éŒ²ï¼š"/>
<text name="title_acc_status_text" value="アカウントã®çŠ¶æ…‹ï¼š"/>
<text name="acc_status_text">
ä½äººã€‚ 支払情報未登録。
@@ -40,9 +40,9 @@
<layout_panel name="profile_buttons_panel">
<button label="フレンド登録" name="add_friend" tool_tip="フレンド登録を申ã—出ã¾ã™"/>
<button label="IM" name="im" tool_tip="インスタントメッセージを開ãã¾ã™"/>
- <button label="コール" name="call" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/>
- <button label="地図" name="show_on_map_btn" tool_tip="ä½äººã‚’地図上ã§è¡¨ç¤ºã™ã‚‹"/>
- <button label="テレãƒãƒ¼ãƒˆ" name="teleport" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹"/>
+ <button label="コール" name="call" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã—ã¾ã™"/>
+ <button label="地図" name="show_on_map_btn" tool_tip="ä½äººã‚’地図上ã§è¡¨ç¤ºã—ã¾ã™"/>
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/>
</layout_panel>
<layout_panel name="profile_me_buttons_panel">
<button label="プロフィールã®ç·¨é›†" name="edit_profile_btn" tool_tip="個人的ãªæƒ…報を編集ã—ã¾ã™"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_covenant.xml b/indra/newview/skins/default/xui/ja/panel_region_covenant.xml
index 5f43f93113..9a517d79e9 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_covenant.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="約款" name="Covenant">
- <text font="SansSerifLarge" name="estate_section_lbl">
- エステート(ä¸å‹•ç”£ï¼‰
+ <text font="SansSerifLarge" name="estate_section_lbl" width="200">
+ ä¸å‹•ç”£
</text>
<text name="estate_name_lbl">
åå‰ï¼š
@@ -26,14 +26,14 @@
ã“ã®ä¸å‹•ç”£ã«ã¯ç´„款ãŒã‚ã‚Šã¾ã›ã‚“。
</text_editor>
<button label="リセット" name="reset_covenant"/>
- <text name="covenant_help_text">
+ <text name="covenant_help_text" left="100">
約款ã®å¤‰æ›´ã¯ä¸å‹•ç”£å…¨åŒºç”»ã«é©ç”¨ã¨ãªã‚Šã¾ã™ã€‚
</text>
- <text name="covenant_instructions">
+ <text name="covenant_instructions" width="390">
ã“ã®ä¸å‹•ç”£ç´„款ã®å¤‰æ›´ã‚’ã™ã‚‹éš›ã¯ã€ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’ドラッグ&ドロップã—ã¦ãã ã•ã„。
</text>
- <text bottom_delta="-34" font="SansSerifLarge" name="region_section_lbl">
- リージョン(地域)
+ <text bottom_delta="-34" font="SansSerifLarge" name="region_section_lbl" width="200">
+ 地域
</text>
<text name="region_name_lbl">
åå‰ï¼š
diff --git a/indra/newview/skins/default/xui/ja/panel_region_debug.xml b/indra/newview/skins/default/xui/ja/panel_region_debug.xml
index 4209fb17e5..f6865c12b1 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_debug.xml
@@ -6,11 +6,11 @@
<text name="region_text">
未知
</text>
- <check_box label="スクリプト無効化" name="disable_scripts_check" tool_tip="ã“ã®åœ°åŸŸã®ã‚¹ã‚¯ãƒªãƒ—トをã™ã¹ã¦ç„¡åŠ¹åŒ–"/>
+ <check_box label="スクリプト無効化" name="disable_scripts_check" tool_tip="ã“ã®åœ°åŸŸã®ã‚¹ã‚¯ãƒªãƒ—トをã™ã¹ã¦ç„¡åŠ¹ã«ã—ã¾ã™"/>
<button label="?" name="disable_scripts_help"/>
- <check_box label="è¡çªã‚’無効化" name="disable_collisions_check" tool_tip="ã“ã®åœ°åŸŸã®éžã‚¢ãƒã‚¿ãƒ¼è¡çªã‚’無効化"/>
+ <check_box label="è¡çªã‚’無効化" name="disable_collisions_check" tool_tip="ã“ã®åœ°åŸŸã®éžã‚¢ãƒã‚¿ãƒ¼è¡çªã‚’無効ã«ã—ã¾ã™"/>
<button label="?" name="disable_collisions_help"/>
- <check_box label="物ç†ä½œç”¨ã‚’無効化" name="disable_physics_check" tool_tip="ã“ã®åœ°åŸŸã®ç‰©ç†ä½œç”¨ã‚’ã™ã¹ã¦ç„¡åŠ¹åŒ–"/>
+ <check_box label="物ç†ä½œç”¨ã‚’無効化" name="disable_physics_check" tool_tip="ã“ã®åœ°åŸŸã®ç‰©ç†ä½œç”¨ã‚’ã™ã¹ã¦ç„¡åŠ¹ã«ã—ã¾ã™"/>
<button label="?" name="disable_physics_help"/>
<button label="é©ç”¨" name="apply_btn"/>
<text name="objret_text_lbl" width="120">
@@ -27,14 +27,14 @@
オプション:
</text>
<check_box label="スクリプト付ãã®ã‚‚ã®" name="return_scripts" tool_tip="スクリプトã®ã‚ªãƒ–ジェクトã ã‘è¿”å´ã—ã¾ã™"/>
- <check_box label="他人ã®åœŸåœ°ã«ã‚ã‚‹ã‚‚ã®" name="return_other_land" tool_tip="他人ã«å±žã™ã‚‹åœŸåœ°ã«ã‚るオブジェクトã®ã¿ã‚’è¿”å´"/>
- <check_box label="ã“ã®ä¸å‹•ç”£ã«å±žã™ã‚‹ã™ã¹ã¦ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚‚ã®" name="return_estate_wide" tool_tip="ã“ã®ä¸å‹•ç”£ã«å«ã¾ã‚Œã¦ã„ã‚‹ã™ã¹ã¦ã®åœ°åŸŸã®ã‚ªãƒ–ジェクトを返å´"/>
+ <check_box label="他人ã®åœŸåœ°ã«ã‚ã‚‹ã‚‚ã®" name="return_other_land" tool_tip="他人ã«å±žã™ã‚‹åœŸåœ°ã«ã‚るオブジェクトã®ã¿ã‚’è¿”å´ã—ã¾ã™"/>
+ <check_box label="ã“ã®ä¸å‹•ç”£ã«å±žã™ã‚‹ã™ã¹ã¦ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚‚ã®" name="return_estate_wide" tool_tip="ã“ã®ä¸å‹•ç”£ã«å«ã¾ã‚Œã¦ã„ã‚‹ã™ã¹ã¦ã®åœ°åŸŸã®ã‚ªãƒ–ジェクトを返å´ã—ã¾ã™"/>
<button label="è¿”å´" name="return_btn"/>
<button label="上部コライダーå–å¾—" name="top_colliders_btn" tool_tip="è¡çªã™ã‚‹å¯èƒ½æ€§ãŒæœ€ã‚‚高ã„オブジェクトã®ãƒªã‚¹ãƒˆ"/>
<button label="?" name="top_colliders_help"/>
<button label="上部スクリプトå–å¾—" name="top_scripts_btn" tool_tip="スクリプトã®å®Ÿè¡Œã«æœ€ã‚‚時間を費やã—ã¦ã„るオブジェクトã®ãƒªã‚¹ãƒˆ"/>
<button label="?" name="top_scripts_help"/>
- <button label="地域å†èµ·å‹•" name="restart_btn" tool_tip="2分間ã®ã‚«ã‚¦ãƒ³ãƒˆãƒ€ã‚¦ãƒ³å¾Œã€åœ°åŸŸã‚’å†èµ·å‹•"/>
+ <button label="地域å†èµ·å‹•" name="restart_btn" tool_tip="2分間ã®ã‚«ã‚¦ãƒ³ãƒˆãƒ€ã‚¦ãƒ³å¾Œã€åœ°åŸŸã‚’å†èµ·å‹•ã—ã¾ã™"/>
<button label="?" name="restart_help"/>
- <button label="å†èµ·å‹•ã‚’é…延" name="cancel_restart_btn" tool_tip="地域ã®å†èµ·å‹•ã‚’1時間é…延ã™ã‚‹"/>
+ <button label="å†èµ·å‹•ã‚’é…延" name="cancel_restart_btn" tool_tip="地域ã®å†èµ·å‹•ã‚’1時間é…延ã—ã¾ã™"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_estate.xml b/indra/newview/skins/default/xui/ja/panel_region_estate.xml
index 976cfacb3f..fcc225c333 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_estate.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="ä¸å‹•ç”£" name="Estate">
- <text name="estate_help_text">
+ <text name="estate_help_text" width="400">
ã“ã®ã‚¿ãƒ–ã®è¨­å®šã¸ã®å¤‰æ›´ã¯ã€ã‚¨ã‚¹ãƒ†ãƒ¼ãƒˆå†…ã®ã™ã¹ã¦ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å½±éŸ¿ã•ã‚Œã¾ã™ã€‚
</text>
<text name="estate_text">
@@ -40,7 +40,7 @@
<check_box label="太陽固定" name="fixed_sun_check"/>
<button label="?" name="fixed_sun_help"/>
<slider label="段階" name="sun_hour_slider"/>
- <check_box label="パブリック・アクセスを許å¯" name="externally_visible_check"/>
+ <check_box label="パブリックアクセスを許å¯" name="externally_visible_check"/>
<button label="?" name="externally_visible_help"/>
<check_box label="直接テレãƒãƒ¼ãƒˆã‚’許å¯" name="allow_direct_teleport"/>
<button label="?" name="allow_direct_teleport_help"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_general.xml b/indra/newview/skins/default/xui/ja/panel_region_general.xml
index 00be5b6b03..168141ee77 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_general.xml
@@ -3,19 +3,19 @@
<text name="region_text_lbl">
地域:
</text>
- <text left="90" name="region_text">
+ <text left_delta="70" name="region_text">
未知
</text>
<text name="version_channel_text_lbl" width="100">
ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š
</text>
- <text left="90" name="version_channel_text">
+ <text left_delta="70" name="version_channel_text">
ä¸æ˜Ž
</text>
<text name="region_type_lbl">
種類:
</text>
- <text name="region_type">
+ <text name="region_type" left_delta="70">
ä¸æ˜Ž
</text>
<check_box label="土地整備をブロック" name="block_terraform_check"/>
@@ -28,9 +28,9 @@
<button label="?" name="restrict_pushobject_help"/>
<check_box label="土地ã®å†è²©ã‚’許å¯" name="allow_land_resell_check"/>
<button label="?" name="land_resell_help"/>
- <check_box label="土地ã®çµ±åˆï¼åˆ†å‰²ã‚’許å¯" name="allow_parcel_changes_check"/>
+ <check_box label="土地ã®çµ±åˆãƒ»åˆ†å‰²ã‚’許å¯" name="allow_parcel_changes_check"/>
<button label="?" name="parcel_changes_help"/>
- <check_box label="土地ã®æ¤œç´¢è¡¨ç¤ºã‚’ブロック" name="block_parcel_search_check" tool_tip="検索çµæžœã§ã€ã“ã®åœ°åŸŸã¨åŒºç”»ã‚’人ã«è¦‹ã›ã‚‹"/>
+ <check_box label="土地ã®æ¤œç´¢è¡¨ç¤ºã‚’ブロック" name="block_parcel_search_check" tool_tip="検索çµæžœã§ã€ã“ã®åœ°åŸŸã¨åŒºç”»ã‚’表示ã™ã‚‹ã‹ã©ã†ã‹ã®è¨­å®šã§ã™"/>
<button label="?" name="parcel_search_help"/>
<spinner label="ã‚¢ãƒã‚¿ãƒ¼æ•°ä¸Šé™" name="agent_limit_spin"/>
<button label="?" name="agent_limit_help"/>
@@ -40,14 +40,14 @@
区分:
</text>
<combo_box label="控ãˆã‚" name="access_combo">
- <combo_box.item label="Adult" name="Adult"/>
+ <combo_box.item label="アダルト" name="Adult"/>
<combo_box.item label="控ãˆã‚" name="Mature"/>
<combo_box.item label="一般" name="PG"/>
</combo_box>
<button label="?" name="access_help"/>
<button label="é©ç”¨" name="apply_btn"/>
- <button label="ユーザー1人ホームテレãƒãƒ¼ãƒˆ" name="kick_btn"/>
- <button label="ユーザー全員ホームテレãƒãƒ¼ãƒˆ" name="kick_all_btn"/>
- <button label="メッセージを地域ã¸é€ä¿¡..." name="im_btn"/>
+ <button label="ユーザー1åをホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="kick_btn"/>
+ <button label="ユーザー全員をホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="kick_all_btn"/>
+ <button label="メッセージを地域ã«é€ä¿¡..." name="im_btn"/>
<button label="テレãƒãƒ–ã®ç®¡ç†..." name="manage_telehub_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_general_layout.xml b/indra/newview/skins/default/xui/ja/panel_region_general_layout.xml
index 9673953d06..df7e5d9129 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_general_layout.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_general_layout.xml
@@ -1,21 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="リージョン(地域)" name="General">
<text name="region_text_lbl">
- リージョン:
+ 地域:
</text>
- <text name="region_text">
+ <text name="region_text" left_delta="70">
ä¸æ˜Ž
</text>
<text name="version_channel_text_lbl">
ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š
</text>
- <text name="version_channel_text">
+ <text name="version_channel_text" left_delta="70">
ä¸æ˜Ž
</text>
<text name="region_type_lbl">
種類:
</text>
- <text name="region_type">
+ <text name="region_type" left_delta="70">
ä¸æ˜Ž
</text>
<check_box label="地形編集をブロック" name="block_terraform_check"/>
@@ -24,9 +24,9 @@
<check_box label="プッシュを制é™" name="restrict_pushobject"/>
<check_box label="土地ã®å†è²©ã‚’許å¯" name="allow_land_resell_check"/>
<check_box label="土地ã®çµ±åˆãƒ»åˆ†å‰²ã‚’許å¯" name="allow_parcel_changes_check"/>
- <check_box label="土地ã®æ¤œç´¢æ•™ç¤ºã‚’ブロック" name="block_parcel_search_check" tool_tip="ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¨ãƒªãƒ¼ã‚¸ãƒ§ãƒ³å†…ã®åŒºç”»ã‚’検索çµæžœã«è¡¨ç¤ºã™ã‚‹"/>
- <spinner label="ã‚¢ãƒã‚¿ãƒ¼æ•°ä¸Šé™" name="agent_limit_spin"/>
- <spinner label="オブジェクトボーナス" name="object_bonus_spin"/>
+ <check_box label="土地ã®æ¤œç´¢è¡¨ç¤ºã‚’ブロック" name="block_parcel_search_check" tool_tip="検索çµæžœã§ã€ã“ã®åœ°åŸŸã¨åŒºç”»ã‚’表示ã™ã‚‹ã‹ã©ã†ã‹ã®è¨­å®šã§ã™"/>
+ <spinner label="ã‚¢ãƒã‚¿ãƒ¼æ•°ä¸Šé™" name="agent_limit_spin" label_width="110" width="190"/>
+ <spinner label="物体ボーナス" name="object_bonus_spin" label_width="110" width="190"/>
<text label="レーティング区分" name="access_text">
レーティング区分:
</text>
@@ -38,6 +38,6 @@
<button label="é©ç”¨" name="apply_btn"/>
<button label="ユーザー1åをホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ..." name="kick_btn"/>
<button label="ユーザー全員をホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ..." name="kick_all_btn"/>
- <button label="リージョンã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡..." name="im_btn"/>
+ <button label="メッセージを地域ã«é€ä¿¡..." name="im_btn"/>
<button label="テレãƒãƒ–ã®ç®¡ç†..." name="manage_telehub_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_texture.xml b/indra/newview/skins/default/xui/ja/panel_region_texture.xml
index ea784df127..17e3260460 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_texture.xml
@@ -48,7 +48,8 @@
数値ã¯ä¸Šã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ãƒ–レンド範囲を示ã—ã¾ã™ã€‚
</text>
<text name="height_text_lbl11">
- 計測å˜ä½ã¯ãƒ¡ãƒ¼ãƒˆãƒ«ã§ã€ã€Œä½Žã€ã®å€¤ã¯ã€1番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®ã€Œæœ€å¤§å€¤ã€ã§ã™ã€‚「高ã€ã®å€¤ã¯ã€4番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®ã€Œæœ€ä½Žå€¤ã€ã§ã™ã€‚
+ 計測å˜ä½ã¯ãƒ¡ãƒ¼ãƒˆãƒ«ã§ã€ã€Œä½Žã€ã®å€¤ã¯ã€1番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®
+「最大値ã€ã§ã™ã€‚「高ã€ã®å€¤ã¯ã€4番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®ã€Œæœ€ä½Žå€¤ã€ã§ã™ã€‚
</text>
<text name="height_text_lbl12">
ãã—ã¦ã€Œé«˜ã€ã®å€¤ã¯ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼#4ã®é«˜ã•ã®ä¸‹é™ã¨ãªã‚Šã¾ã™ã€‚
diff --git a/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml
index e8b5be63ae..1d81304860 100644
--- a/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml
@@ -4,7 +4,7 @@
ローディング...
</text>
<scroll_list name="scripts_list">
- <scroll_list.columns label="サイズ (kb)" name="size"/>
+ <scroll_list.columns label="サイズ (kb)" name="size" width="90"/>
<scroll_list.columns label="URL" name="urls"/>
<scroll_list.columns label="オブジェクトå" name="name"/>
<scroll_list.columns label="場所" name="location"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml
index fe0b44d8f4..6a62af4ec6 100644
--- a/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml
@@ -13,9 +13,9 @@
ローディング...
</text>
<scroll_list name="scripts_list">
- <scroll_list.columns label="サイズ (kb)" name="size"/>
+ <scroll_list.columns label="サイズ (kb)" name="size" width="90"/>
<scroll_list.columns label="オブジェクトå" name="name"/>
- <scroll_list.columns label="オブジェクトã®æ‰€æœ‰è€…" name="owner"/>
+ <scroll_list.columns label="オブジェクトã®æ‰€æœ‰è€…" name="owner" width="120"/>
<scroll_list.columns label="区画・ä½ç½®" name="location"/>
</scroll_list>
<button label="リスト更新" name="refresh_list_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_side_tray.xml b/indra/newview/skins/default/xui/ja/panel_side_tray.xml
index ce5f0b940c..48636f1e3b 100644
--- a/indra/newview/skins/default/xui/ja/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/ja/panel_side_tray.xml
@@ -2,26 +2,26 @@
<!-- Side tray cannot show background because it is always
partially on screen to hold tab buttons. -->
<side_tray name="sidebar">
- <sidetray_tab description="サイドãƒãƒ¼ã‚’表示・éžè¡¨ç¤º" name="sidebar_openclose"/>
- <sidetray_tab description="ホーム。" name="sidebar_home">
+ <sidetray_tab description="サイドãƒãƒ¼ã‚’表示・éžè¡¨ç¤º" name="sidebar_openclose" tab_title="サイドãƒãƒ¼ã‚’é–‹ã・閉ã˜ã‚‹"/>
+ <sidetray_tab description="ホーム。" name="sidebar_home" tab_title="ホーム">
<panel label="ホーム" name="panel_home"/>
</sidetray_tab>
- <sidetray_tab description="ã‚ãªãŸã®å…¬é–‹ãƒ—ロフィールã¨ãƒ”ックを編集ã—ã¦ãã ã•ã„。" name="sidebar_me">
+ <sidetray_tab description="ã‚ãªãŸã®å…¬é–‹ãƒ—ロフィールã¨ãƒ”ックを編集ã—ã¦ãã ã•ã„。" name="sidebar_me" tab_title="マイ プロフィール">
<panel label="ミー" name="panel_me"/>
</sidetray_tab>
- <sidetray_tab description="フレンドã€é€£çµ¡å…ˆã€è¿‘ãã®äººã‚’探ã—ã¦ãã ã•ã„。" name="sidebar_people">
+ <sidetray_tab description="フレンドã€é€£çµ¡å…ˆã€è¿‘ãã®äººã‚’探ã—ã¦ãã ã•ã„。" name="sidebar_people" tab_title="人">
<panel_container name="panel_container">
<panel label="グループ情報" name="panel_group_info_sidetray"/>
<panel label="ブロックã•ã‚ŒãŸä½äººã¨ã‚ªãƒ–ジェクト" name="panel_block_list_sidetray"/>
</panel_container>
</sidetray_tab>
- <sidetray_tab description="è¡ŒããŸã„場所ã€è¡Œã£ãŸã“ã¨ã®ã‚る場所を探ã—ã¦ãã ã•ã„。" label="場所" name="sidebar_places">
+ <sidetray_tab description="è¡ŒããŸã„場所ã€è¡Œã£ãŸã“ã¨ã®ã‚る場所を探ã—ã¦ãã ã•ã„。" label="場所" name="sidebar_places" tab_title="場所">
<panel label="場所" name="panel_places"/>
</sidetray_tab>
- <sidetray_tab description="ã‚ãªãŸã®æŒã¡ç‰©ã‚’眺ã‚ã¦ãã ã•ã„。" name="sidebar_inventory">
+ <sidetray_tab description="ã‚ãªãŸã®æŒã¡ç‰©ã‚’眺ã‚ã¦ãã ã•ã„。" name="sidebar_inventory" tab_title="マイ æŒã¡ç‰©">
<panel label="æŒã¡ç‰©ã‚’編集" name="sidepanel_inventory"/>
</sidetray_tab>
- <sidetray_tab description="ã‚ãªãŸã®å®¹å§¿ã‚„ç¾åœ¨ã®è¦‹ãŸç›®ã‚’変更ã—ã¦ãã ã•ã„。" name="sidebar_appearance">
+ <sidetray_tab description="ã‚ãªãŸã®å®¹å§¿ã‚„ç¾åœ¨ã®è¦‹ãŸç›®ã‚’変更ã—ã¦ãã ã•ã„。" name="sidebar_appearance" tab_title="マイ 容姿">
<panel label="容姿ã®ç·¨é›†" name="sidepanel_appearance"/>
</sidetray_tab>
</side_tray>
diff --git a/indra/newview/skins/default/xui/ja/panel_status_bar.xml b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
index 063e584762..8d375aa6cd 100644
--- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
@@ -21,7 +21,7 @@
<panel.string name="buycurrencylabel">
L$ [AMT]
</panel.string>
- <button label="" label_selected="" name="buycurrency" tool_tip="ç§ã®æ®‹é«˜"/>
+ <button label="" label_selected="" name="buycurrency" tool_tip="所æŒé‡‘"/>
<button label="L$ ã®è³¼å…¥" name="buyL" tool_tip="クリックã—㦠L$ を購入ã—ã¾ã™"/>
<text name="TimeText" tool_tip="ç¾åœ¨æ™‚刻(太平洋)">
12:00 AM
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index 288ad4bc1d..de628943ad 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -339,7 +339,7 @@
リンク
</string>
<string name="AvatarEditingAppearance">
- (容姿ã®ç·¨é›†ï¼‰
+ (容姿ã®ç·¨é›†ä¸­ï¼‰
</string>
<string name="AvatarAway">
一時退席中
@@ -588,7 +588,7 @@
接続ã—ã¾ã—ãŸ
</string>
<string name="unavailable">
- ã‚ãªãŸã®ç¾åœ¨ã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã§ã¯ã€ãƒœã‚¤ã‚¹ã‚’利用ã§ãã¾ã›ã‚“。
+ ç¾åœ¨åœ°ã§ã¯ã€ãƒœã‚¤ã‚¹ã‚’利用ã§ãã¾ã›ã‚“。
</string>
<string name="hang_up">
インワールドボイスãƒãƒ£ãƒƒãƒˆã®é€šè©±ãŒåˆ‡æ–­ã•ã‚Œã¾ã—ãŸ
@@ -642,7 +642,7 @@
控ãˆã‚
</string>
<string name="SIM_ACCESS_ADULT">
- Adult
+ アダルト
</string>
<string name="SIM_ACCESS_DOWN">
オフライン
@@ -786,7 +786,7 @@
添付アイテムをä¿å­˜
</string>
<string name="TeleportOffer">
- テレãƒãƒ¼ãƒˆã‚’渡ã™
+ テレãƒãƒ¼ãƒˆã‚’é€ã‚‹
</string>
<string name="StartUpNotifications">
ä¸åœ¨ä¸­ã«æ–°ã—ã„通知ãŒå±Šãã¾ã—ãŸã€‚
@@ -833,7 +833,7 @@
<string name="InventoryNoTexture">
æŒã¡ç‰©å†…ã«ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ã‚³ãƒ”ーãŒã‚ã‚Šã¾ã›ã‚“
</string>
- <string name="no_transfer" value=" (å†è²©/プレゼントä¸å¯ï¼‰"/>
+ <string name="no_transfer" value=" (å†è²©ãƒ»ãƒ—レゼントä¸å¯ï¼‰"/>
<string name="no_modify" value=" (編集ä¸å¯ï¼‰"/>
<string name="no_copy" value=" (コピーä¸å¯ï¼‰"/>
<string name="worn" value=" (ç€ç”¨ä¸­ï¼‰"/>
@@ -874,7 +874,7 @@
<string name="No Filters" value="ã„ã„㈠"/>
<string name="Since Logoff" value=" - ログオフ以æ¥"/>
<string name="InvFolder My Inventory">
- マイ æŒã¡ç‰©
+ æŒã¡ç‰©
</string>
<string name="InvFolder My Favorites">
ãŠæ°—ã«å…¥ã‚Š
@@ -1706,7 +1706,7 @@
Linden 所在地
</string>
<string name="Adult">
- Adult
+ アダルト
</string>
<string name="Arts&amp;Culture">
アートã¨ã‚«ãƒ«ãƒãƒ£ãƒ¼
@@ -3190,7 +3190,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
ç¾åœ¨åœ°ã®è©³ç´°ã‚’見る
</string>
<string name="LocationCtrlComboBtnTooltip">
- マイロケーション履歴
+ マイ ロケーション履歴
</string>
<string name="LocationCtrlForSaleTooltip">
ã“ã®åœŸåœ°ã‚’購入
@@ -3247,7 +3247,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
-- インスタントメッセージã®ä¿å­˜é–‹å§‹ --
</string>
<string name="IM_typing_start_string">
- [NAME] ã¯å…¥åŠ›ä¸­...
+ [NAME] ã¯å…¥åŠ›ä¸­ã§ã™...
</string>
<string name="Unnamed">
(åå‰ãªã—)
diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp
index f7ac5361c5..ef93586c6e 100644
--- a/indra/newview/tests/lllogininstance_test.cpp
+++ b/indra/newview/tests/lllogininstance_test.cpp
@@ -2,7 +2,7 @@
* @file lllogininstance_test.cpp
* @brief Test for lllogininstance.cpp.
*
- * $LicenseInfo:firstyear=2008&license=internal$
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
* Copyright (c) 2008, Linden Research, Inc.
* $/LicenseInfo$
*/
diff --git a/indra/newview/tests/llxmlrpclistener_test.cpp b/indra/newview/tests/llxmlrpclistener_test.cpp
index c94ba0a3e8..c2c7e963b9 100644
--- a/indra/newview/tests/llxmlrpclistener_test.cpp
+++ b/indra/newview/tests/llxmlrpclistener_test.cpp
@@ -4,7 +4,7 @@
* @date 2009-03-20
* @brief Test for llxmlrpclistener.
*
- * $LicenseInfo:firstyear=2009&license=internal$
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
* Copyright (c) 2009, Linden Research, Inc.
* $/LicenseInfo$
*/
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 15a51bbe14..595afd86e0 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -268,12 +268,17 @@ class WindowsManifest(ViewerManifest):
self.path('libapr-1.dll')
self.path('libaprutil-1.dll')
self.path('libapriconv-1.dll')
+
except RuntimeError, err:
print err.message
print "Skipping llcommon.dll (assuming llcommon was linked statically)"
self.disable_manifest_check()
+ # Mesh 3rd party libs needed for auto LOD and collada reading
+ self.path("libcollada14dom21.dll")
+ self.path("glod.dll")
+
# For textures
if self.args['configuration'].lower() == 'debug':
self.path("openjpegd.dll")
@@ -319,9 +324,9 @@ class WindowsManifest(ViewerManifest):
# For using FMOD for sound... DJS
self.path("fmod.dll")
-
+
self.enable_no_crt_manifest_check()
-
+
# Media plugins - QuickTime
if self.prefix(src='../media_plugins/quicktime/%s' % self.args['configuration'], dst="llplugin"):
self.path("media_plugin_quicktime.dll")
diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp
index d183aac208..0ff53f3e00 100644
--- a/indra/test_apps/llplugintest/llmediaplugintest.cpp
+++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp
@@ -1169,8 +1169,8 @@ void LLMediaPluginTest::keyboard( int key )
exit( 0 );
};
- mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_DOWN, key, 0 );
- mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_UP, key, 0 );
+ mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_DOWN, key, 0 , LLSD());
+ mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_UP, key, 0, LLSD());
};
////////////////////////////////////////////////////////////////////////////////
diff --git a/install.xml b/install.xml
index 0c3c88ce72..eb5bb0f964 100644
--- a/install.xml
+++ b/install.xml
@@ -43,6 +43,39 @@
</map>
</map>
</map>
+ <key>GLOD</key>
+ <map>
+ <key>copyright</key>
+ <string>Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia. All rights reserved.</string>
+ <key>description</key>
+ <string>Geometric Level of Detail for OpenGL</string>
+ <key>license</key>
+ <string>GLOD</string>
+ <key>packages</key>
+ <map>
+ <key>darwin</key>
+ <map>
+ <key>md5sum</key>
+ <string>ab78835bafcad3bb7223eaeecb5a6a4b</string>
+ <key>url</key>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GLOD-1.0pre4-darwin-20090918.tar.bz2</uri>
+ </map>
+ <key>linux</key>
+ <map>
+ <key>md5sum</key>
+ <string>66ae292063b80f3a9fecb46dcd4fe5ec</string>
+ <key>url</key>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GLOD-1.0pre4-linux-20091023.tar.bz2</uri>
+ </map>
+ <key>windows</key>
+ <map>
+ <key>md5sum</key>
+ <string>39fae44d406aa56a0b3d00f5433bbf15</string>
+ <key>url</key>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GLOD-1.0pre4-windows-20100129.tar.bz2</uri>
+ </map>
+ </map>
+ </map>
<key>SDL</key>
<map>
<key>copyright</key>
@@ -220,6 +253,39 @@
</map>
</map>
</map>
+ <key>colladadom</key>
+ <map>
+ <key>copyright</key>
+ <string>Copyright 2005 Sony Computer Entertainment Inc.</string>
+ <key>description</key>
+ <string>Library for processing collada file format</string>
+ <key>license</key>
+ <string>scea</string>
+ <key>packages</key>
+ <map>
+ <key>darwin</key>
+ <map>
+ <key>md5sum</key>
+ <string>786de8bfebb5df3a3b51a7832119f8d8</string>
+ <key>url</key>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/colladadom-2.1.1-darwin-20090731.tar.bz2</uri>
+ </map>
+ <key>linux</key>
+ <map>
+ <key>md5sum</key>
+ <string>dde909f84fd2b7c56138f8fd193664c4</string>
+ <key>url</key>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/colladadom-2.1.1-linux-20091203.tar.bz2</uri>
+ </map>
+ <key>windows</key>
+ <map>
+ <key>md5sum</key>
+ <string>6c2267ba2735bb5bc6229bc4366fce86</string>
+ <key>url</key>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/colladadom-2.1.1-windows-20100129.tar.bz2</uri>
+ </map>
+ </map>
+ </map>
<key>curl</key>
<map>
<key>copyright</key>
@@ -948,23 +1014,23 @@ anguage Infrstructure (CLI) international standard</string>
<key>darwin</key>
<map>
<key>md5sum</key>
- <string>d97d843704514ae1b5f153fab2931920</string>
+ <string>95f44f0023dddc80be4398fc4f213861</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.6-darwin-20100120.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.6-darwin-20100208.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
- <string>c4c40fca14a8bd32096f8a27c75c526f</string>
+ <string>4c75b2f1e8524c7844ee3ea1cd59a3db</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-20100105c.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-20100209b.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
- <string>18c1a4059bad1504a457e70c8c218033</string>
+ <string>1e9798dc424a6f6c2bea50649bbcc7ae</string>
<key>url</key>
- <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.6-20100120.tar.bz2</uri>
+ <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.6-20100210.tar.bz2</uri>
</map>
</map>
</map>
@@ -1219,6 +1285,32 @@ anguage Infrstructure (CLI) international standard</string>
</map>
</map>
</map>
+ <key>pcre</key>
+ <map>
+ <key>copyright</key>
+ <string>Copyright (c) 1997-2008 University of Cambridge</string>
+ <key>description</key>
+ <string>Regular expression library</string>
+ <key>license</key>
+ <string>bsd</string>
+ <key>packages</key>
+ <map>
+ <key>darwin</key>
+ <map>
+ <key>md5sum</key>
+ <string>63e2dc55142b8b36521c1b0c9b6ed6bb</string>
+ <key>url</key>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pcre-7.6-darwin-20090730.tar.bz2</uri>
+ </map>
+ <key>linux</key>
+ <map>
+ <key>md5sum</key>
+ <string>0886d0b1cdf104b6341df1832a8a7e09</string>
+ <key>url</key>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pcre-7.6-linux-20090804.tar.bz2</uri>
+ </map>
+ </map>
+ </map>
<key>pth</key>
<map>
<key>copyright</key>
@@ -1367,23 +1459,23 @@ anguage Infrstructure (CLI) international standard</string>
<key>darwin</key>
<map>
<key>md5sum</key>
- <string>51f3fa1ab39563505df83b48ba432a3c</string>
+ <string>316f86790b7afb5c9bd4f95bc193b80f</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7852-darwin-20100115.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7930-darwin-20100205.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
- <string>ab9573d6aa2acdd79a553c144c9ecb09</string>
+ <string>13f6886fa3e6675838e47adcabb0f0ac</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7852-linux-20100115.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7930-linux-20100205.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
- <string>88ab785eebdc4f53a7dfc4e0b95f67ec</string>
+ <string>2a81e3c42799c33742746925f16b54ca</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7852-windows-20100115.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7930-windows-20100205.tar.bz2</uri>
</map>
</map>
</map>
@@ -1480,6 +1572,75 @@ anguage Infrstructure (CLI) international standard</string>
<key>url</key>
<string>http://www.xfree86.org/4.4.0/LICENSE9.html#sgi</string>
</map>
+ <key>GLOD</key>
+ <map>
+ <key>text</key>
+ <string>The GLOD Open-Source License Version 1.0 July 22, 2003
+
+Copyright (C) 2003 Jonathan Cohen, Nat Duca, Johns Hopkins University
+and David Luebke, Brenden Schubert, University of Virginia. All rights
+reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, is permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer and
+ request.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer and
+ request in the documentation and/or other materials provided with
+ the distribution.
+
+3. The name "GLOD" must not be used to endorse or promote products
+ derived from this software without prior written permission.
+
+4. Redistributions of any modified version of this source, whether in
+ source or binary form , must include a form of the following
+ acknowledgment: "This product is derived from the GLOD library,
+ which is available from http://www.cs.jhu.edu/~graphics/GLOD."
+
+5. Redistributions of any modified version of this source in binary
+ form must provide, free of charge, access to the modified version
+ of the code.
+
+6. This license shall be governed by and construed and enforced in
+ accordance with the laws of the State of Maryland, without
+ reference to its conflicts of law provisions. The exclusive
+ jurisdiction and venue for all legal actions relating to this
+ license shall be in courts of competent subject matter jurisdiction
+ located in the State of Maryland.
+
+TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, GLOD IS PROVIDED
+UNDER THIS LICENSE ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
+THAT GLOD IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR
+PURPOSE OR NON-INFRINGING. ALL WARRANTIES ARE DISCLAIMED AND THE
+ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE CODE IS WITH
+YOU. SHOULD ANY CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE
+COPYRIGHT HOLDER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY
+NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY
+CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY CODE IS
+AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL
+THE COPYRIGHT HOLDER OR ANY OTHER CONTRIBUTOR BE LIABLE FOR ANY
+SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES FOR LOSS OF
+PROFITS, REVENUE, OR FOR LOSS OF INFORMATION OR ANY OTHER LOSS.
+
+YOU EXPRESSLY AGREE TO FOREVER INDEMNIFY, DEFEND AND HOLD HARMLESS THE
+COPYRIGHT HOLDERS AND CONTRIBUTORS OF GLOD AGAINST ALL CLAIMS,
+DEMANDS, SUITS OR OTHER ACTIONS ARISING DIRECTLY OR INDIRECTLY FROM
+YOUR ACCEPTANCE AND USE OF GLOD.
+
+Although NOT REQUIRED, we would appreciate it if active users of GLOD
+put a link on their web site to the GLOD web site when possible.
+</string>
+ <key>url</key>
+ <string>http://www.cs.jhu.edu/~graphics/GLOD/license/</string>
+ </map>
<key>MSDTW</key>
<map>
<key>text</key>
@@ -1805,6 +1966,11 @@ IMPORTANT NOTE: To the extent this software may be used to reproduce materials,
EA0300
</string>
</map>
+ <key>scea</key>
+ <map>
+ <key>url</key>
+ <string>http://research.scea.com/scea_shared_source_license.html</string>
+ </map>
<key>sleepycat</key>
<map>
<key>url</key>